对于这个例子,我有 3 个简单的表(页面、订阅者和关注者):
对于每个页面,我需要知道它有多少订阅者和关注者。 我的结果应该是这样的:
我尝试将 COUNT 函数与 GROUP BY 结合使用,如下所示:
SELECT p.ID, COUNT(s.UID) AS SubCount, COUNT(f.UID) AS FollowCount
FROM page p, subs s, followers f
WHERE p.ID = s.ID AND p.ID = f.ID AND s.ID = f.ID
GROUP BY p.ID
显然这个语句返回了一个错误的结果。
我的另一项尝试是使用两个不同的 SELECT 语句,然后将两个子结果组合到一个表中。
SELECT p.ID, COUNT(s.UID) AS SubCount FROM page p, subs s WHERE p.ID = s.ID GROUP BY p.ID
和
SELECT p.ID, COUNT(f.UID) AS FollowCount FROM page p, follow f WHERE p.ID = f.ID GROUP BY p.ID
我觉得必须有一种更简单/更短的方法来做这件事,但我太没有经验了,找不到它。
最佳答案
永远不要在FROM
子句中使用逗号。 始终使用正确、明确、标准 JOIN
语法。
接下来,了解 COUNT()
的作用。它计算非 NULL 值的数量。因此,您的表达式将返回相同的值——因为 f.UID
和 s.UID
永远不会是 NULL
(由于 JOIN
条件)。
问题在于不同的维度会成倍增加数量。一个简单的解决方法是使用 COUNT(DISTINCT)
:
SELECT p.ID, COUNT(DISTINCT s.UID) AS SubCount, COUNT(DISTINCT f.UID) AS FollowCount
FROM page p JOIN
subs s
ON p.ID = s.ID JOIN
followers f
ON s.ID = f.ID
GROUP BY p.ID;
内部连接等同于原始查询。您可能需要 left join
以便计数为零:
SELECT p.ID, COUNT(DISTINCT s.UID) AS SubCount, COUNT(DISTINCT f.UID) AS FollowCount
FROM page p LEFT JOIN
subs s
ON p.ID = s.ID LEFT JOIN
followers f
ON p.ID = f.ID
GROUP BY p.ID;
关于mysql - SQL查询中的多个聚合函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54963699/