SQL - 附加一个必须查询结果的计数

时间:2018-01-08 10:28:25

标签: mysql sql laravel

我有一个Laravel预订应用程序,但我正在为客户做一些手动报告。

我有一个在SequelPro中运行的SQL查询:

SELECT t.name
     , t.email
     , t.trial_ends_at
     ,
  FROM teams t 
 ORDER 
    BY t.trial_ends_at DESC

但是,我现在要做的是在每一行中添加另一个字段,显示该团队的客户端数量。

团队客户的关系是:

用户可以预订很多, 预订属于用户, 预订有一个team_id字段

我希望将用户数量附加到他们至少预订过该团队ID的位置。

在Laravel的雄辩中,我会这样做:

return User::whereHas('bookings', function($q) {
    $q->where('team_id', THE ID)
})->count();

2 个答案:

答案 0 :(得分:2)

加入查找计数的子查询:

SELECT 
    t.name,
    t.email,
    t.trial_ends_at,
    COALESCE(b.cnt, 0) AS client_cnt
FROM teams t
LEFT JOIN
(
    SELECT team_id, COUNT(*) AS cnt
    FROM bookings
    GROUP BY team_id
) b
    ON t.id = b.team_id   -- this assumes that id joins to team_id
ORDER BY
    t.trial_ends_at DESC;

您有以下要求:

  

我希望将用户数量附加到他们至少预订过该团队ID的位置。

在我看来,如果有与该记录关联的预留,则用户只会出现在bookings表中的记录中。换句话说,我认为我们不需要对此要求进行任何额外检查,因为如果用户确实出现了,那么默认情况下他已经出现过一次。

答案 1 :(得分:0)

如果您的第一个查询产生$teams,那么您可以执行类似 -

的操作
foreach($teams as $team){
    $userCount = User::whereHas('bookings', function($q) use($team){
        $q->where('team_id', $team->id);
    })->count();
    if($userCount>0){
      $team->userCount = $userCount;
   }
}

如果您在userCount个集合中有多个booking,则会追加$teams,否则不会。{/ p>