我试图得到两个不同表的行数 LEFT JOIN
在mysql查询中。当我有一个 COUNT
在这样一张table上:
SELECT a.title, a.image, COUNT(o.id) AS occasions
FROM activity a
LEFT JOIN occasion AS o ON a.id = o.activity_id
WHERE a.user_id = 1
GROUP BY a.id
ORDER BY a.created_at
DESC LIMIT 50
在这里,一切正常,我得到了很多“场合”。
但是当我试图添加一个额外的 COUNT
额外的 LEFT JOIN
,第二次 COUNT
是错误的:
SELECT a.title, a.image, COUNT(o.id) AS occasions, COUNT(au.id) AS users
FROM activity a
LEFT JOIN occasion AS o ON a.id = o.activity_id
LEFT JOIN activity_user AS au ON a.id = au.activity_id
WHERE a.user_id = 4
GROUP BY a.id
ORDER BY a.created_at
DESC LIMIT 50
在这里,我得到的好次数“场合”,但“用户”似乎是一个副本的“场合”计数,这是错误的。
所以我的问题是,如何修复这个查询,使两者 COUNT
一起工作?
2条答案
按热度按时间6rqinv9w1#
COUNT()
计算非空值。修复查询的简单方法是COUNT(DISTINCT)
:这很可能管用。但是,它会创建一个中间表,它是两个表(对于每个标题)的笛卡尔积。它可以长得很大。更具可伸缩性的解决方案是在加入之前使用子查询和聚合。
kh212irz2#
活动用户使用的左联接限制了您的结果,因为数据库找不到相关数据。但是当您使用leftouter连接时,它应该返回所有预期的行及其计数。