关于获取行和关联计数的简单SQL问题

时间:2009-09-08 14:09:16

标签: sql

这个很容易。

我的问题与this one非常相似;基本上,我有一个帖子表,一个带有post_id外键的注释表,以及一个带有post 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
但是我的数据不好了。我错过了什么?

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分:0)

尝试: COUNT(DISTINCT c.ID)作为NumComments

答案 3 :(得分:0)

你正在思考树木,而不是记录集。

在记录集中,您获得每个评论,并且每个投票多次相互返回。运行没有group by和count的查询,看看我的意思。

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