两个一对多关系 - 每个活动有很多地方,每个地方有很多预订

时间:2016-04-24 09:34:23

标签: mysql database laravel

我有三张桌子:活动,景点和预订。 活动有很多地方(日期时间)和 景点有很多预订。

我在spot表中有'space'列,在bookings表中有'spot_id'。在Spot表中我需要对所有空格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 * actual-sum_of_spaces。那是因为我有单个事件的多个位置。

如何从表格点获取空格总数event_id和sametime获取给定event_id的所有预订的计数。斑点表中的行数与预订中的行数不匹配。

bookings table

spotstable

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分: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