mysql - SQL查询中的多个聚合函数

标签 mysql sql

对于这个例子,我有 3 个简单的表(页面、订阅者和关注者):

My three tables

对于每个页面,我需要知道它有多少订阅者和关注者。 我的结果应该是这样的:

Result

我尝试将 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.UIDs.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/

相关文章:

mysql和区分大小写真让人困惑

MySQL 按列值分组 block ,按其他列排序

c# - INSERT 语句与 FOREIGN KEY 约束错误冲突

php + mysql + 如何在数据库中添加逗号分割字符串

mysql - 如何在匹配id时根据另一张表的计数值更新一张表?

mysql - 合并连接并存在于连接表上

mysql - 需要查询自引用表以查找不是任何项目的父项的所有项目

sql - JPA Query - 位置参数中的 sql 注入(inject) jpa native 查询

sql - 更新表中所有具有空值的字段(MYSQL)

MySQL插入语句语法错误与SET