join中的multiple count()

a6b3iqyw  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(395)

我试图得到两个不同表的行数 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 一起工作?

6rqinv9w

6rqinv9w1#

COUNT() 计算非空值。修复查询的简单方法是 COUNT(DISTINCT) :

SELECT a.title, a.image,
       COUNT(DISTINCT o.id) AS occasions, COUNT(DISTINCT au.id) AS users 
. . .

这很可能管用。但是,它会创建一个中间表,它是两个表(对于每个标题)的笛卡尔积。它可以长得很大。更具可伸缩性的解决方案是在加入之前使用子查询和聚合。

kh212irz

kh212irz2#

活动用户使用的左联接限制了您的结果,因为数据库找不到相关数据。但是当您使用leftouter连接时,它应该返回所有预期的行及其计数。

相关问题