【问题标题】:Simple SQL question about getting rows and associated counts关于获取行和相关计数的简单 SQL 问题
【发布时间】:2009-09-08 14:09:16
【问题描述】:

这应该很容易。

我的问题和this one很相似;基本上,我有一个帖子表,一个带有 post_id 外键的 cmets 表,以及一个带有帖子 ID 外键的投票表。我想做一个查询并返回一个包含每个帖子一行的结果集,以及关联的 cmets 和投票数。

从我上面链接的问题来看,似乎要返回一个只包含每个帖子的一行和一个评论计数的表格,这是正确的方法:

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

但我得到了不好的数字。我错过了什么?

【问题讨论】:

    标签: sql


    【解决方案1】:
    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
    

    【讨论】:

      【解决方案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
      

      【讨论】:

      • 一如既往地为您提供卓越的解决方案。 :-) +1
      • 即使 Tomalak 的作品,这绝对是“更正确”的解决方案。它满足了要求,而不是支持解决方案。如果您的表没有单字段 PK,则您必须采取进一步的诡计才能使“DISTINCT”解决方案起作用。我要补充一点,我使用快捷方式,但我对我的行为承担全部责任。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        在记录集中,您将获得每条评论和多次返回的每条投票,它们相互结合。运行不带分组依据和计数的查询以了解我的意思。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-03
          • 1970-01-01
          • 1970-01-01
          • 2022-11-16
          • 1970-01-01
          相关资源
          最近更新 更多