【问题标题】:sql - left join - countsql - 左连接 - 计数
【发布时间】:2011-01-14 00:25:53
【问题描述】:

假设我有两张桌子。文章和cmets。

当我从articles表中选择列时,我还想在同一个select语句中选择文章上的cmets数量......(假设这两个表之间的公共字段是articleid)

我该怎么做?我可以完成它,但我不知道我的方法是否有效,所以我想学习正确的方法。

【问题讨论】:

    标签: sql sql-server tsql join


    【解决方案1】:

    这应该更有效,因为 group by 只在 Comment 表上完成。

    SELECT  
           a.ArticleID, 
           a.Article, 
           isnull(c.Cnt, 0) as Cnt 
    FROM Article a 
    LEFT JOIN 
        (SELECT c.ArticleID, count(1) Cnt
         FROM Comment c
        GROUP BY c.ArticleID) as c
    ON c.ArticleID=a.ArticleID 
    ORDER BY 1
    

    【讨论】:

    • ^ 如果只将计数附加到您的选择中,上面的答案是更有效/更正确的答案。
    【解决方案2】:

    用途:

       SELECT a.articleid, 
              COUNT(*) AS num_comments
         FROM ARTICLES a
    LEFT JOIN COMMENTS c ON c.articleid = a.articleid
     GROUP BY a.articleid
    

    无论您想从ARTICLES 表中获得什么列,都必须在GROUP BY 子句中定义,因为它们没有对它们执行聚合函数。

    【讨论】:

    • 仅添加 group by 并不总是最好的做法。我看到人们在 group by 子句中使用 100 列(不是 100 列,而是很多列)编写查询,因为他们不知道如何正确使用聚合。这就是我使用子查询发布解决方案的原因。
    • @JonH:类似的 SQL Server(以及其他 DB)不允许您列出/返回未包装在聚合函数中的列(除非使用分析函数),而无需在 @987654325 中定义它们@ 子句。如果省略GROUP BY 子句,您根据所提供的内容在 SQL Server 上收到错误。 MySQL 是唯一支持此类功能的数据库,并且它是非标准的:dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html
    • 我知道我的意思是很多人不明白分组和聚合是如何工作的。我见过人们按 100 列分组只是为了得到他们认为可能是正确的结果。
    【解决方案3】:

    应该这样做..

    SELECT
       article_column_1, article_column_2, count( ct.articleid) as comments
    FROM
       article_table at
       LEFT OUTER JOIN comment_table ct ON at.articleid = ct.articleid
    GROUP BY 
       article_column_1, article_column_2
    

    【讨论】:

    • 你可能想要一个 GROUP BY。如果有人担心,如果没有加入的记录,这将正确返回 0。
    • le dorfier 正确 - 此查询不会在 SQL Server 上按原样运行。
    【解决方案4】:
        -- Working Syntax example from my environment changed to fit this context. 
    SELECT a.article
        ,A.articleid
        ,(
            SELECT Count(B.articleid)
            FROM dbo.comment AS B
            WHERE A.articleid = B.articleid
            ) AS comment#
        ,(
            SELECT Count(C.articleid)
            FROM dbo.comments AS C
            WHERE A.articleid = C.articleid
            ) AS comments#
    FROM dbo.article AS A;
    

    【讨论】:

      【解决方案5】:
      SELECT 
             a.Article,
             a.ArticleID,
             t.COUNTOFCOMMENTS
      FROM
             Article a
      LEFT JOIN
             Comment c
      ON c.ArticleID=a.ArticleID
      LEFT JOIN
      (SELECT ArticleID, COUNT(CommentID) AS COUNTOFCOMMENTS FROM Comments GROUP BY ArticleID) t
      ON t.ArticleID = a.ArticleID
      

      【讨论】:

      • 所以添加一个非常简单的东西。
      • @OP - 如果需要,您也可以取出 LEFT JOIN 注释 c,我只是把它放在那里,以便您可以根据需要从 cmets 表中提取列。
      • 由于第一个左连接,这将为每个评论返回一行。
      • @JBrooks,请阅读 @OP 的 cmets,正如我所说,您可以摆脱左连接,它可以展示 SQL 或任何关系数据库系统的强大功能。它允许用户从其他表中提取信息。这样,如果他/她不想按文章进行简单的分组,他/她可以再次获得评论信息。再次请在发帖前阅读 cmets。
      • @JonH,我确实阅读了 cmets - 我的意思是,如果您有 10 个 cmets 用于第 1 条,那么第 1 条将被列出 10 次,每条旁边都有 10 个计数。我认为这不是所要求的。
      猜你喜欢
      • 2014-08-08
      • 1970-01-01
      • 2021-10-19
      • 1970-01-01
      • 2019-05-19
      • 2018-08-21
      • 2016-10-02
      • 2015-05-31
      • 1970-01-01
      相关资源
      最近更新 更多