2016-04-24 63 views
2

我有三個表:事件,地點和預訂。 活動有許多景點(日期時間)和 景點有很多預訂。兩個一對多的關係 - 每個事件有很多點,每個點有很多預訂

我在景點表中有'spaces'列,在預訂表中有'spot_id'。而在景點表中,我需要總和所有空格GROUP BY event_id,並在預訂表中我需要計算所有預訂GROUP BY event_id。這兩個表都有event_id。

我需要查詢類似:

select S.event_id, sum(S.spaces), count(B.spot_id) 
from spots S, bookings B 
where S.event_id = B.event_id; 

我需要輸出,如:

Event_id  sum(Spaces)  count(Bookings) 
    1    300     60 
    2    450    120 

但由於其一對多的關係,我得到的空間錯總和。如果我有60個預訂= 60行,因此60 *實際sum_of_spaces。那是因爲我有多個單項賽事的點。

如何從表格中獲取event_id和sametime的空間總數獲取所有預定event_id的計數。點表中的行數與預訂中的行數不匹配。

bookings table

spotstable

回答

0

試試這個:

$events = DB::table('bookings') 
      ->join(DB::raw('(select S.event_id, sum(S.spaces) as sum_spaces from spots S group by S.event_id) d'), function($join) 
      { 
       $join->on('bookings.event_id', '=', 'd.event_id'); 
      }) 
      ->select('bookings.event_id', 'd.sum_spaces', 
         DB::raw('COUNT(bookings.event_id)')) 
      ->groupBy('bookings.event_id') 
      ->get(); 
+0

我試着上面的查詢a nd它沒有得到正確的空間總和。我爲事件1和6次預訂提供了62個空間。但是我獲得了438個空間和24個預訂 –

+0

向我們顯示您的餐桌數據,以便我們不必猜測。 –

+0

我已經添加了兩張表的屏幕截圖。請看看它。 –

0

可以計算sum(spaces)第一和加入(衍生)與bookings導致計算count(bookings)

select event_id, sum_spaces, count(b.event_id) count_bookings 
from (
    select S.event_id, sum(S.spaces) as sum_spaces 
    from spots S 
    group by S.event_id 
) d 
join bookings b on b.event_id = d.event_id 
group by b.event_id 
+0

我想他想要一個Laravel PHP查詢。 –

+0

@TimBiegeleisen - 當用'sum','count'和派生表查看例子時,我看到很多'raw'被使用。那麼,爲什麼不把完整的查詢放在單個DB :: raw中呢? –