【问题标题】:two one to many relations - each Event has many spots and each spot has many bookings两个一对多关系 - 每个活动都有很多点,每个点有很多预订
【发布时间】:2016-08-17 17:09:27
【问题描述】:

我有三张桌子:Events、Spots 和 Bookings。 活动有很多地方(日期时间)和 Spots 有很多预订。

我在点表中有“空格”列,在预订表中有“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 * actual-sum_of_spaces。那是因为我有多个单项赛事的位置。

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

bookings table

spotstable

【问题讨论】:

    标签: mysql database laravel


    【解决方案1】:

    试试这个:

    $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();
    

    【讨论】:

    • 我尝试了上面的查询,但它没有得到正确的空格总和。我有 62 个活动 1 和 6 的预订空间。但我得到了 438 个空间和 24 个预订
    • 向我们展示您的表格的数据,这样我们就不必猜测了。
    • 我已经添加了两个表格的屏幕截图。请看一下。
    • 尝试运行我的答案。
    【解决方案2】:

    您可以先计算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
    

    【讨论】:

    • 我想他想要一个 Laravel PHP 查询。
    • @TimBiegeleisen - 查看sumcount 和派生表的示例时,我看到很多raw 被使用。那么为什么不把完整的查询放到一个单独的 DB::raw 中呢?
    猜你喜欢
    • 2013-07-16
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多