在此示例中,我得到了3个简单的表(Page,Subs和Followers):
对于每个页面,我需要知道它有多少个订阅者和关注者。 我的结果应该看起来像这样:
我尝试将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
我觉得必须有一个更简单/更短的方法来做,但是我没有经验。
答案 0 :(得分:2)
从不在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;
答案 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;