2010-02-07 136 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;