2009-10-01 2 views
1

다음과 같은 쿼리가 있습니다.LEFT JOIN을 MySQL의 그룹핑/카운트와 함께 작동시키는 방법?

SELECT type.id, type.name, COUNT(*) AS tot 
FROM page 
LEFT JOIN type ON page.type=type.id 
GROUP BY type.id 

그러나 모든 유형이 선택되지는 않습니다. 페이지 테이블에없는 모든 유형이 누락됩니다. 난 그게 형식이 발생하지 않는 0을 포함하여 얼마나 많은 페이지가 그 유형을 가지고 있는지를 나타내는 숫자로 모든 유형을 나열하기를 원할뿐입니다. 다른 참여가 필요합니까?

답변

3

대신 RIGHT JOIN 마십시오. 시도해보십시오.

SELECT type.id, type.name, COUNT(page.type) AS tot 
FROM page 
RIGHT JOIN type ON page.type=type.id 
GROUP BY type.id 

다른 계산 방법에 유의하십시오. 페이지 유형은 페이지가없는 유형의 경우 NULL이됩니다. 이러한 행은 무시 될 것입니다. COUNT

[EDIT] 다음은 예입니다. 우리는 데이터를 다음과 같은 경우 : 우리가 JOIN 내 대답처럼 할 경우

 
    type 
id name 
1  A 
2  B 
3  C 

    page 
id type 
1  1 
2  1 
3  2 

는 (더 GROUP BY 또는 COUNT), 우리의 결과 집합은 다음과 같을 것 :

 
type.id type.name page.id page.type 
     1   A  1   1 
     1   A  2   1 
     2   B  3   2 
     3   C  NULL  NULL 

을 이제 우리는 GROUP BY을 수행 할 때 및 COUNT(type.id), 행 여기서 count.id NULL이 아닌 계산됩니다. 즉, 모든 행 같습니다 결과는 B와 C에 대한 1 2 우리가 대신 COUNT(page.type)을 할 경우

, 우리는 C에 대한 A, B 1 0 2를 얻을 수 (page.type 때문에 NULL는 C에 대한했다 !)

+0

나는 이것을 올바르게 사용하기 전에 count (*)를 사용했다. 누락 된 유형은 2를 카운트로 반환했다. 당신이 말한 것처럼 count (page.type)를 사용하면 0이됩니다. 왜 이런 일이 발생합니까? – DisgruntledGoat

+0

count (type.id)를 사용하면 2를 반환하는 것처럼 보입니다. – DisgruntledGoat

+1

'COUNT (*)'는 모든 행을 계산합니다. 'COUNT (page.type)'는 page.type이 NULL이 아닌 행만 계산합니다. 내 대답에 JOIN을 할 때,'pages'를 가지지 않는'types' 행은 모든'page' 컬럼을 NULL로 설정합니다. 우리가'COUNT (page.type)'을 할 때,'pages'를 가진'types' 행만을 계산합니다 (페이지 열은 null이 아닙니다). – hrnt

0

사용 합체 가입 그들이 오른쪽에있는 테이블에 존재하는 경우에 관계없이 조인 식의 왼쪽에있는 테이블의 모든 행을 찾아온다

SELECT 
    COALESCE(type.id, 0), 
    COALESCE(type.name, 'NoType'), 
    COUNT(*) AS tot 
FROM 
    page 
LEFT JOIN 
    type 
ON 
    page.type=type.id 
GROUP BY 
    COALESCE(type.id, 0), 
    COALESCE(type.name, 'NoType') 
2

하여 왼쪽 GROUP에 NULL 값을 제공합니다 측면 (식의 양쪽을 전환)이 시도 :

SELECT type.id, type.name, COUNT(*) AS tot 
FROM type 
LEFT JOIN page ON type.id=page.type 
GROUP BY type.id, type.name 
관련 문제