我正在使用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/