2010-02-07 6 views
5

두 개의 테이블이 있다고 가정합니다. 기사 및 의견.sql - left join - count

난 기사 테이블에서 열을 선택하고 때, 나는 또한 ... 같은 select 문에있는 문서에 대한 의견의 수를 선택합니다

방법 (두 테이블 사이의 공통 필드 가정은은 articleID입니다) 나는 그것을합니까? 나는 그것을 끝낼 수는 있지만, 내 길은 효율적 일지 모르겠다. 그래서 나는 올바른 길을 배우고 싶다.

답변

4

사용 : 당신이 ARTICLES 테이블에서 원하는 무엇이든 열

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

, 당신은 그들이 때문에 GROUP BY 절에 정의해야합니다 그것들에 수행 된 집계 함수를 가지고 있지 않다.

+1

그룹을 추가하는 것만으로도 항상 최선의 일은 아닙니다. 사람들은 집계를 올바르게 사용하는 방법을 모르기 때문에 group by 절에서 100s (100s가 아닌 많은 수의 열) 쿼리를 작성하는 것을 보았습니다. 그래서 하위 쿼리를 사용하여 솔루션을 게시했습니다. – JonH

+0

@JonH : SQL Server (다른 DB 중)와 유사한 기능을 사용하면 분석 함수를 사용하지 않는 한 집계 함수로 래핑되지 않은 열을 나열하거나 반환 할 수 없습니다 (분석 함수를 사용하지 않는 한). GROUP BY 절을 생략하면 ** 제공되는 내용에 따라 SQL Server에서 오류가 발생합니다 **. MySQL은 이러한 기능을 지원하는 유일한 DB이며 비표준입니다 : http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html –

+0

그 점을 알고 있습니다. 많은 사람들이 그룹 별 및 집계 방식이 어떻게 작동하는지 이해하지 못했습니다. 사람들이 올바른 결과라고 생각하는 것을 얻기 위해 100 개의 항목으로 그룹화하는 것을 보았습니다. – 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

하위 조회에는은 articleID 없기 때문에이 작동하지 않습니다 .. –

+0

그래서 하나 개의 매우 간단한 물건을 추가 할 수 있습니다. – JonH

+0

@Gaby - 기사 ID를 표시하도록 수정되었습니다. – JonH

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

+0

'le dorfier'는 정확합니다.이 쿼리는 SQL Server에서 그대로 실행되지 않습니다. –

+0

네, 참으로 ... 일하러 편집했습니다 ... –

7

그룹 기준은 설명 테이블에서만 수행되므로이 ​​방법이 더 효율적입니다.

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;