2009-09-08 62 views
3

这应该是一个简单的问题。有关获取行和相关计数的简单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 

但是我收到了坏数字。我错过了什么?

回答

3
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 
+0

真棒!谢谢。 – justinbach 2009-09-08 14:20:20

0

尝试: COUNT(DISTINCT c.ID)AS NumComments

0

你在树上,没有的记录所思所想。

在记录集中,您获得每个评论,并且每个投票将多次返回相互结合。运行没有群组的查询,并查看我的意思。

解决方法很简单:使用COUNT(DISCTINCT c.ID)和COUNT(DISTINCT v.ID)

2
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 
+0

一如既往地提供卓越的解决方案。 :-) +1 – Tomalak 2009-09-08 14:23:16

+0

这绝对是“更正确”的解决方案,即使Tomalak的作品。它符合要求而不是支持解决方案。如果您的表没有单场PK,那么您必须采取进一步的欺骗手段才能使“DISTINCT”解决方案发挥作用。我会补充说我使用了快捷方式,但我接受我的行为的全部责任。 – 2009-09-08 14:32:27