我正在使用Laravel 5.4的查询生成器在三个表上执行一系列leftJoins。这是我的桌子:

项目

id  type  title                visibility  status  created_at
--  ----  -----                ----------  ------  ----------
1   1     This is a Title      1           1       2017-06-20 06:39:20
2   1     Here's Another Item  1           1       2017-06-24 18:12:13
3   1     A Third Item         1           1       2017-06-26 10:10:34


count_loves

id  items_id  user_id
--  -------   -------
1   1         2
2   1         57
3   1         18


count_downloads

id  items_id  user_id
--  -------   -------
1   1         879
2   1         323


这是我在Laravel中运行的代码:

    $items_output = DB::table('items')
        ->leftJoin('count_loves', 'items.id', '=', 'count_loves.items_id')
        ->leftJoin('count_downloads', 'items.id', '=', 'count_downloads.items_id')
        ->where('items.visibility', '=', '1')
        ->where('items.status', '=', '1')
        ->orderBy('items.created_at', 'desc')
        ->select('items.*', DB::raw('count(count_loves.id) as loveCount'), DB::raw('count(count_downloads.id) as downloadCount'))
        ->groupBy('items.id')
        ->get();


当我返回此查询的结果时,得到以下计数:

count_loves:6

count_downloads:6

如您所见,实际计数值应为:

count_loves:3

count_downloads:2

例如,如果我向count_loves表中添加另一个条目,则总数将移至8。如果此后我向count_downloads表中添加另一个条目,则总数将跳转至12。因此,两个计数将相乘。

如果我死掉并转储查询,这是我得到的:


  “ query” =>“选择'items'。*,count(count_loves.id)作为loveCount,
  count(count_downloads.id)as download从'items'左加入计数
  'items'上的'count_loves'。'id'='count_loves'。'items_id'左连接
  'items'。'id'='count_downloads'。'items_id'上的'count_downloads'
  其中'items'。'visibility'=?和'items'。'status'=?通过...分组
  'items'。'id'按'items'。'created_at'desc”排序


如何使用查询生成器执行多个leftJoins并依靠多个表返回正确的总和?

最佳答案

注意:

这旨在作为帮助答案,而不是总的绝对答案,但我无法在注释中编写代码。我不是要投票(对于那些迫不及待想要投票否决我的人)。我已经创建了表并在原始sql上尝试了UNION查询。我得到正确的结果。我没有安装laravel,但是也许您可以在Laravel中尝试UNION查询。

https://laravel.com/docs/5.4/queries#unions

select count(count_downloads.user_id)
from count_downloads
join items
on items.id = count_downloads.items_id
UNION
select count(count_loves.user_id)
from count_loves
join items
on items.id = count_loves.items_id

关于php - 使用Laravel的查询生成器的多个leftJoins产生不正确的计数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44761155/

10-14 17:29
查看更多