복붙노트

[SQL] MySQL의 GROUP BY와 리턴 수 0

SQL

MySQL의 GROUP BY와 리턴 수 0

이 같은 데이터베이스 테이블

============================
= suburb_id   |   value
= 1           |    2
= 1           |    3
= 2           |    4
= 3           |    5

쿼리는

SELECT COUNT(suburb_id) AS total, suburb_id 
  FROM suburbs 
 where suburb_id IN (1,2,3,4) 
GROUP BY suburb_id

나는이 쿼리를 실행하는 동안 그러나, 그것은하지 않습니다주고 COUNT (suburb_id) = 0 때 suburb_id = 0 교외 테이블에, 더 suburb_id 4 없기 때문에,이 쿼리처럼 suburb_id = 4 0을 반환하려면

============================
= total       |   suburb_id
= 2           |    1
= 1           |    2
= 1           |    3
= 0           |    4

해결법

  1. ==============================

    1.그룹에 의해 당신이 특정 범주에 대한 행이, 당신은 수를 얻을 않을 수없는 제품도 있습니다 그렇다면, 함께 작동하도록 행을 필요로한다. 그들이 함께 그룹화하기 전에 소스 행을 제한하는 등의 where 절을 생각하십시오. WHERE 절은에 의해 그룹 카테고리의 목록을 제공하지 않습니다.

    그룹에 의해 당신이 특정 범주에 대한 행이, 당신은 수를 얻을 않을 수없는 제품도 있습니다 그렇다면, 함께 작동하도록 행을 필요로한다. 그들이 함께 그룹화하기 전에 소스 행을 제한하는 등의 where 절을 생각하십시오. WHERE 절은에 의해 그룹 카테고리의 목록을 제공하지 않습니다.

    당신이 할 수있는 것은 다음 하위 쿼리의 수를 할 범주 (교외)를 선택하는 쿼리를 작성합니다. (나는이 MySQL의 지원이 어떤지 잘 모르겠어요)

    뭔가 같은 :

    SELECT 
      s.suburb_id,
      (select count(*) from suburb_data d where d.suburb_id = s.suburb_id) as total
    FROM
      suburb_table s
    WHERE
      s.suburb_id in (1,2,3,4)
    

    (MSSQL, 사과)

  2. ==============================

    2.이:

    이:

    SELECT  id, COUNT(suburb_id)
    FROM    (
            SELECT  1 AS id
            UNION ALL
            SELECT  2 AS id
            UNION ALL
            SELECT  3 AS id
            UNION ALL
            SELECT  4 AS id
            ) ids
    LEFT JOIN
            suburbs s
    ON      s.suburb_id = ids.id
    GROUP BY
            id
    

    아니면 이거:

    SELECT  id,
            (
            SELECT  COUNT(*)
            FROM    suburb
            WHERE   suburb_id = id
            )
    FROM    (
            SELECT  1 AS id
            UNION ALL
            SELECT  2 AS id
            UNION ALL
            SELECT  3 AS id
            UNION ALL
            SELECT  4 AS id
            ) ids
    

    이 문서에서는 두 가지 방법의 성능을 비교 :

    , 만 4 레코드를 쿼리하는대로, 귀하의 경우에는 많은 문제가되지 않지만.

  3. ==============================

    3.질문:

    질문:

    select case
             when total is null then 0
             else total
           end as total_with_zeroes,
           suburb_id
    from (SELECT COUNT(suburb_id) AS total, suburb_id 
            FROM suburbs 
           where suburb_id IN (1,2,3,4) 
        GROUP BY suburb_id) as dt
    
  4. ==============================

    4.모든 조건이이 경우에 같은 간단한 경우 @ geofftnz의 솔루션은 잘 작동합니다. 하지만 난 그냥 보고서의 각 열은 다른 쿼리입니다 보고서를 생성하기 위해 비슷한 문제를 해결했다. 당신은 몇 가지 선택 문이 힘 작업과 같은 무언가로부터 결과를 결합해야합니다.

    모든 조건이이 경우에 같은 간단한 경우 @ geofftnz의 솔루션은 잘 작동합니다. 하지만 난 그냥 보고서의 각 열은 다른 쿼리입니다 보고서를 생성하기 위해 비슷한 문제를 해결했다. 당신은 몇 가지 선택 문이 힘 작업과 같은 무언가로부터 결과를 결합해야합니다.

    당신은 프로그램이 쿼리를 생성 할 수 있습니다. 주어진 ID로 suburb_id 할 경기가없는 경우에도 쿼리가 왼쪽을 허용 조인 사용하여 행을 반환합니다. 만약 (대부분 않습니다), 당신은 0 널 (null)을 대체 할 IFNULL를 사용할 수있는 DB 지원을 :

    select IFNULL(a.count,0), IFNULL(b.count,0), IFNULL(c.count,0), IFNULL(d.count,0)
    from (select count(suburb_id) as count from suburbs where id=1 group by suburb_id) a,
     left join (select count(suburb_id) as count from suburbs where id=2 group by suburb_id) b on a.suburb_id=b.suburb_id
     left join (select count(suburb_id) as count from suburbs where id=3 group by suburb_id) c on a.suburb_id=c.suburb_id
     left join (select count(suburb_id) as count from suburbs where id=4 group by suburb_id) d on a.suburb_id=d.suburb_id;
    

    이것에 대해 좋은 점은 (필요한 경우)이 각각 "왼쪽 가입"약간 다른 (아마도 매우 복잡한) 쿼리를 사용할 수 있습니다.

    면책 조항 : 대용량 데이터 세트에 대한 쿼리의 유형 (I 더 조사하지 않고 알 수있는 충분한 SQL을 작성하지 않는) 매우 잘 수행 할 수도 있지만, 적어도 그것은 유용한 결과를 제공해야합니다 ;-)

  5. from https://stackoverflow.com/questions/3597577/return-count-0-with-mysql-group-by by cc-by-sa and MIT license