有关获取行和相关计数的简单SQL问题
这应该是一个简单的问题。有关获取行和相关计数的简单SQL问题
我的问题与this one非常相似;基本上,我有一个帖子表,一个带有用于post_id的外键的注释表,以及一个带有用于帖子id的外键的投票表。我想要做一个单一的查询并获取每个帖子包含一行的结果集,以及相关评论和投票的数量。
从我所连接到上面的问题,似乎是为找回仅包含每个帖子和评论数行的表,这是正确的做法:
SELECT a.ID, a.Title, COUNT(c.ID) AS NumComments
FROM Articles a
LEFT JOIN Comments c ON c.ParentID = a.ID
GROUP BY a.ID, a.Title
我想加入投票计数将会像添加另一个左连接一样容易,如在
SELECT a.ID, a.Title, COUNT(c.ID) AS NumComments, COUNT(v.id AS NumVotes)
FROM Articles a
LEFT JOIN Comments c ON c.ParentID = a.ID
LEFT JOIN Votes v ON v.ParentID = a.ID
GROUP BY a.ID, a.Title
但是我收到了坏数字。我错过了什么?
SELECT
a.ID,
a.Title,
COUNT(DISTINCT c.ID) AS NumComments,
COUNT(DISTINCT v.id) AS NumVotes
FROM
Articles a
LEFT JOIN Comments c ON c.ParentID = a.ID
LEFT JOIN Votes v ON v.ParentID = a.ID
GROUP BY
a.ID,
a.Title
尝试: COUNT(DISTINCT c.ID)AS NumComments
你在树上,没有的记录所思所想。
在记录集中,您获得每个评论,并且每个投票将多次返回相互结合。运行没有群组的查询,并查看我的意思。
解决方法很简单:使用COUNT(DISCTINCT c.ID)和COUNT(DISTINCT v.ID)
SELECT id, title,
(
SELECT COUNT(*)
FROM comments c
WHERE c.ParentID = a.ID
) AS NumComments,
(
SELECT COUNT(*)
FROM votes v
WHERE v.ParentID = a.ID
) AS NumVotes
FROM articles a
一如既往地提供卓越的解决方案。 :-) +1 – Tomalak 2009-09-08 14:23:16
这绝对是“更正确”的解决方案,即使Tomalak的作品。它符合要求而不是支持解决方案。如果您的表没有单场PK,那么您必须采取进一步的欺骗手段才能使“DISTINCT”解决方案发挥作用。我会补充说我使用了快捷方式,但我接受我的行为的全部责任。 – 2009-09-08 14:32:27
真棒!谢谢。 – justinbach 2009-09-08 14:20:20