2010-02-07 138 views
5

假设我有两个表。文章和评论。sql - 左连接 - 计数

,当我选择从文章表列,我也希望选择在同一SELECT语句中的文章评论数...(假设这两个表之间的公共领域是articleID)可以

如何我要这样做吗?我可以完成它,但我不知道我的方式是否有效,所以我想学习正确的方法。

回答

4

用途:

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子句中定义没有对它们执行集合功能。

+1

只需添加组并不总是最好的事情。我发现人们在group by by语句中使用100s(好的不是100s,但是很多)列写查询,因为他们不知道如何正确使用聚合。这就是我使用子查询发布解决方案的原因。 – JonH 2010-02-07 03:32:37

+0

@JonH:SQL Server(和其他DB)类似的将不允许您列出/返回未包含在聚合函数中的列(除非使用分析函数)而无需在“GROUP BY”子句中定义它们。如果您省略了GROUP BY子句,则**将根据提供的内容**在SQL Server上收到错误。 MySQL是唯一支持这种功能的数据库,它是非标准的:http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html – 2010-02-07 03:39:59

+0

我知道我的观点很多人不明白团体和团体是如何工作的。我已经看到人们将100多列组合起来,以获得他们认为可能是正确结果的内容。 – JonH 2010-02-07 18:46:41

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

这是行不通的,因为在你的子查询没有条款ArticleID .. – 2010-02-07 03:24:47

+0

所以添加一个非常简单的东西。 – JonH 2010-02-07 03:30:23

+0

@Gaby - 编辑显示文章ID。 – JonH 2010-02-07 03:31:22

2

这应该做到这一点..

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 
+1

你可能想要一个GROUP BY。 如果有人关心,如果没有连接的记录,这将正确返回0。 – dkretz 2010-02-07 03:25:29

+0

'le dorfier'是正确的 - 此查询不会按原样在SQL Server上运行。 – 2010-02-07 03:41:24

+0

是的,确实球员......编辑工作.. – 2010-02-07 03:49:50

7

这应该更有效,因为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 
0
-- 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;