2010-07-12 7 views
2

나는 2 개 테이블이MySQL의 COUNT 제로 항목

inquiry_id ethnicity_id 
1 1 
2 1 
3 1 
4 2 
5 2 

나는 inqu의 수를 보여주는 테이블을 생성하고 싶다. 민족에 의한 ires. 지금까지 내 쿼리는 다음과 같습니다.

SELECT options_ethnicity.ethnicity_name, COUNT('inquiries.ethnicity_id') AS count 
FROM (inquiries 
    LEFT JOIN options_ethnicity ON 
    options_ethnicity.ethnicity_id = inquiries.ethnicity_id) 
GROUP BY options_ethnicity.ethnicity_id 

쿼리는 정확한 대답을 제공하지만 결과가 0 인 African/American에 대한 열은 없습니다. 내가 가입 왼쪽이 오른쪽으로 가입 교체 할 경우

White 3 
Hispanic 2 

, 나는 3 민족의 이름을 얻을 수 있지만, 아프리카/미국의 개수가 잘못되었습니다.

White 3 
Hispanic 2 
African/American 1 

어떤 도움을 주시면 감사하겠습니다. 가입 당신이 LEFT를 사용하기 때문에

SELECT 
    options_ethnicity.ethnicity_name, 
    COALESCE(COUNT(inquiries.ethnicity_id), 0) AS count 
FROM options_ethnicity LEFT JOIN inquiries ON inquiries.ethnicity_id = options_ethnicity.ethnicity_id 
GROUP BY options_ethnicity.ethnicity_id 

UNION ALL 

SELECT 
    'NULL Placeholder' AS ethnicity_name, 
    COUNT(inquiries.inquiry_id) AS count 
FROM inquiries 
WHERE inquiries.ethnicity_id IS NULL 
+0

작업 쿼리 - UNION을 UNION ALL으로 변경합니다. 제거 할 중복 항목이 없습니다. –

+0

네, 맞습니다. UNION을 UNION ALL으로 변경했습니다. 어느 것이 더 빠를 것입니다. – Mitchell

답변

5

의 문자열을 계산 : 여기

는 작업 쿼리 것으로 보인다 것과이 게시물에 대한 업데이트입니다 LEFT JOIN에 정의 된 테이블에 대한 참조는 null 일 수 있습니다. (이 경우)는 0이 NULL 값을 변환 할 필요가 어떤 의미

SELECT oe.ethnicity_name, 
      COALESCE(COUNT(i.ethnicity_id), 0) AS count 
    FROM OPTIONS_ETHNICITY oe 
LEFT JOIN INQUIRIES i ON i.ethnicity_id = oe.ethnicity_id 
GROUP BY oe.ethnicity_id 

이 예는 COALESCE을 사용하여 NULL 값을 처리하는 ANSI 표준을 의미합니다. 최초의 null 이외의 값이 돌려 주어집니다 만, 아무것도 발견되지 않는 경우는 null를 돌려줍니다. IFNULL은 MySQL에서 유효한 대안이지만 COALESCE가있는 동안 다른 데이터베이스로 이식 할 수 없습니다. ethnicity_id이 NULL이고 실제 데이터베이스 테이블에서


가의 문의 테이블의 일부 항목이, 즉 민족은 기록되지 않았다. 이러한 Null 값을 계산할 수 있도록 모든 아이디어가 표시 될 수 있도록하려면 어떻게해야합니까?

나는 당신이 직면하고있는 문제를 이해 생각 :

SELECT oe.ethnicity_name, 
      COALESCE(COUNT(i.ethnicity_id), 0) AS count 
    FROM (SELECT t.ethnicity_name, 
        t.ethnicity_id 
      FROM OPTIONS_ETHNICITY t 
      UNION ALL 
      SELECT 'NULL placeholder' AS ethnicity_name, 
        NULL AS ethnicity_id) oe 
LEFT JOIN INQUIRIES i ON i.ethnicity_id = oe.ethnicity_id 
GROUP BY oe.ethnicity_id 

이 의지 픽업 모든 NULL이 인스턴스를 ethncity_id하지만,이 "NULL 자리"그룹에 계산 속성 것입니다. IE :

ethnicity_name | COUNT 
------------------------ 
White   | 3 
Hispanic   | 2 
NULL placeholder | ? 
+0

COALESCE를 사용하면 분명히 효과적입니다. 나는 COALESCE를 연구하기 위해 벗어났다. OMG 조랑말 정말 고마워. – Mitchell

+0

실제 데이터베이스 테이블에는 ethnicity_id가 NULL 인 인콰이어리 테이블의 일부 항목이 있습니다. 즉 인종이 기록되지 않았습니다. 이러한 Null 값을 계산할 수 있도록 모든 아이디어가 표시 될 수 있도록하려면 어떻게해야합니까? – Mitchell

+0

@Mitchell : 업데이트를보고, 그게 뭔지 알고 싶으면 알려주세요. –

3

당신은 대신 오른쪽 열에

SELECT options_ethnicity.ethnicity_name, COUNT(inquiries.ethnicity_id) AS count 
FROM inquiries 
RIGHT JOIN options_ethnicity ON options_ethnicity.ethnicity_id = inquiries.ethnicity_id 
GROUP BY options_ethnicity.ethnicity_id 
0

왜 쿼리를 "되돌릴"수 있습니까?

SELECT 
    options_ethnicity.ethnicity_name, 
    COUNT(inquiries.ethnicity_id) AS count 
FROM 
    options_ethnicity 
    Left Join inquiries On options_ethnicity.ethnicity_id = inquiries.ethnicity_id 
GROUP BY 
    options_ethnicity.ethnicity_id 

당신은 여전히 ​​수도 합체 호출이 필요하지만, 나에게,이 쿼리는 당신이 달성하려고하는지에 대한 더 많은 의미가 있습니다.

+0

Brandon, 응답 해 주셔서 감사합니다. 나는 당신의 "되돌려 진"쿼리가 기능적으로 원래의 쿼리와 같지만 "LEFT JOIN"이 "RIGHT JOIN"으로 바뀌었고 올바른 논리가 맞다고 생각합니다. COALESCE는 빈 민족 프로파일 카테고리가 0이되도록하기 위해 여전히 필요합니다. – Mitchell