2010-02-07 43 views
5

giả sử tôi có hai bảng. bài viết và bình luận.sql - bên trái tham gia - số

khi tôi đang chọn cột từ bảng điều, tôi cũng muốn chọn số ý kiến ​​về bài viết trong báo cáo kết quả lựa chọn tương tự ... (giả sử trường chung giữa hai bảng này là ArticleID)

cách tôi có làm thế không Tôi có thể làm cho nó được thực hiện, nhưng tôi không biết nếu cách của tôi sẽ có hiệu quả, vì vậy tôi muốn tìm hiểu đúng cách.

Trả lời

4

Sử dụng:

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

Dù cột mà bạn muốn từ bảng ARTICLES, bạn sẽ phải xác định trong GROUP BY khoản vì họ không có chức năng tổng hợp được thực hiện trên chúng.

+1

Chỉ cần thêm nhóm theo không phải luôn luôn là điều tốt nhất để làm. Tôi thấy mọi người viết truy vấn với 100s (ok không phải 100s nhưng LOT) của các cột trong nhóm của họ theo mệnh đề bởi vì họ không biết cách sử dụng tổng hợp một cách chính xác. Đó là lý do tại sao tôi đăng một giải pháp bằng cách sử dụng truy vấn phụ. – JonH

+0

@JonH: SQL Server (trong số các DB khác) tương tự sẽ không cho phép bạn liệt kê/trả về các cột không được gộp trong các hàm tổng hợp (trừ khi sử dụng các hàm phân tích) mà không định nghĩa chúng trong mệnh đề 'GROUP BY'. Nếu bạn bỏ qua mệnh đề 'GROUP BY', bạn ** sẽ ** nhận được một lỗi trên SQL Server dựa trên những gì được cung cấp. MySQL là DB duy nhất hỗ trợ chức năng như vậy, và nó không chuẩn: http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html –

+0

Tôi biết rằng quan điểm của tôi có rất nhiều người không hiểu cách thức nhóm và tổng hợp làm việc. Tôi đã thấy mọi người theo nhóm 100 cột chỉ để có được những gì họ nghĩ có thể là kết quả chính xác. – JonH

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

này sẽ không làm việc như không có articleID trong subquery của bạn .. –

+0

Vì vậy, thêm một công cụ rất đơn giản. – JonH

+0

@Gaby - được chỉnh sửa để hiển thị id bài viết. – JonH

2

này nên làm điều đó ..

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

Bạn có thể muốn có GROUP BY. Trong trường hợp bất kỳ ai quan tâm, điều này sẽ trả lại đúng 0 nếu không có hồ sơ tham gia. – dkretz

+0

'le dorfier' là đúng - truy vấn này sẽ không chạy trên SQL Server như là. –

+0

có thực sự guys ... chỉnh sửa để làm việc .. –

7

Điều này sẽ hiệu quả hơn vì nhóm này chỉ được thực hiện trên bảng Nhận xét.

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; 
Các vấn đề liên quan