SQL查询中的多个聚合函数

时间:2019-03-02 22:35:25

标签: mysql sql

在此示例中,我得到了3个简单的表(Page,Subs和Followers):

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

我觉得必须有一个更简单/更短的方法来做,但是我没有经验。

2 个答案:

答案 0 :(得分:2)

从不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;

答案 1 :(得分:0)

在这种情况下,应使用标量子查询。

SELECT p.id,
       (SELECT Count(s_uid)
        FROM   subs s1
        WHERE  s1.s_id = p.id) AS cnt_subs,
       (SELECT Count(f_uid)
        FROM   followers f1
        WHERE  f1.f_id = p.id) AS cnt_fol
FROM   page p
GROUP  BY p.id;