복붙노트

[SQL] GROUP BY - 그룹화하지 않음 NULL

SQL

GROUP BY - 그룹화하지 않음 NULL

나는 기능에 의해 그룹을 사용하여 결과를 반환하는 방법을 알아 내려고 노력하고있어.

GROUP BY는 예상대로 작동하지만, 내 질문은 : 그것은 NULL 필드를 무시하여 그룹을 가질 수 있습니다. 그래서 그렇지 않은 그룹 NULL을 함께한다는 것을 나는 아직도 지정된 필드가 NULL 인 모든 행을 필요로하기 때문이다.

SELECT `table1`.*, 
    GROUP_CONCAT(id SEPARATOR ',') AS `children_ids`
FROM `table1` 
WHERE (enabled = 1) 
GROUP BY `ancestor` 

그래서 지금은 5 개 행이 말할 수와 조상 필드는 나에게 1 개 행을 반환 NULL입니다 .... 그러나 나는 모든 5를 원한다.

해결법

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

    1.아마도 당신은에 그들 고유 및 그룹 만들기 위해 널 컬럼에 무언가를 추가해야합니까? 난 그냥뿐만 아니라 UUID 대신 사용하는 시퀀스의 일종 ()하지만,이 힘의 일을 찾고 있었다.

    아마도 당신은에 그들 고유 및 그룹 만들기 위해 널 컬럼에 무언가를 추가해야합니까? 난 그냥뿐만 아니라 UUID 대신 사용하는 시퀀스의 일종 ()하지만,이 힘의 일을 찾고 있었다.

    SELECT `table1`.*, 
        IFNULL(ancestor,UUID()) as unq_ancestor
        GROUP_CONCAT(id SEPARATOR ',') AS `children_ids`
    FROM `table1` 
    WHERE (enabled = 1) 
    GROUP BY unq_ancestor
    
  2. ==============================

    2.열 Y로 그룹화 할 때, Y의 값은 NULL이다하는 모든 행은 함께 그룹화된다.

    열 Y로 그룹화 할 때, Y의 값은 NULL이다하는 모든 행은 함께 그룹화된다.

    NULL은 NULL 동일하지이기 때문에 약간 놀라운하지만이 동작은 SQL-2003 표준에 의해 정의된다.

    당신은 다른 값을 그룹화하여 해결할 수 있습니다, 당신의 그룹화 열의 데이터의 (수학적으로 말하기) 일부 기능.

    고유 한 열 X가있는 경우 다음이 용이하다.

    X      Y
    -------------
    1      a
    2      a
    3      b
    4      b
    5      c
    6      (NULL)
    7      (NULL)
    8      d
    
    SELECT GROUP_CONCAT(`X`)
      FROM `tbl`
     GROUP BY `Y`;
    

    결과:

    GROUP_CONCAT(`foo`)
    -------------------
    6,7
    1,2
    3,4
    5
    8
    
    SELECT GROUP_CONCAT(`X`)
      FROM `tbl`
     GROUP BY IFNULL(`Y`, `X`);
    

    결과:

    GROUP_CONCAT(`foo`)
    -------------------
    6
    7
    1,2
    3,4
    5
    8
    
    SELECT GROUP_CONCAT(`X`), IFNULL(`Y`, `X`) AS `grp`
      FROM `tbl`
     GROUP BY `grp`;
    

    결과:

    GROUP_CONCAT(`foo`)     `grp`
    -----------------------------
    6                       6
    7                       7
    1,2                     a
    3,4                     b
    5                       c
    8                       d
    

    당신은 당신이 사용할 수있는 고유 한 열이없는 경우 대신 고유 한 자리 값을 생성 할 수 있습니다. 나는 독자에게 연습으로이 떠날거야.

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

    3.GROUP BY IFNULL (required_field, ID)

    GROUP BY IFNULL (required_field, ID)

  4. ==============================

    4.

    SELECT table1.*, 
        GROUP_CONCAT(id SEPARATOR ',') AS children_ids
    FROM table1
    WHERE (enabled = 1) 
    GROUP BY ancestor
           , CASE WHEN ancestor IS NULL
                      THEN table1.id
                      ELSE 0
             END
    
  5. ==============================

    5.어쩌면 경우 이전 솔루션의 빠른 버전 당신은 (그것을 table1.id입니다 가정하자) 표에서 고유 한 식별자를 가지고 :

    어쩌면 경우 이전 솔루션의 빠른 버전 당신은 (그것을 table1.id입니다 가정하자) 표에서 고유 한 식별자를 가지고 :

    SELECT `table1`.*, 
        GROUP_CONCAT(id SEPARATOR ',') AS `children_ids`,
        IF(ISNULL(ancestor),table1.id,NULL) as `do_not_group_on_null_ancestor`
    FROM `table1` 
    WHERE (enabled = 1) 
    GROUP BY `ancestor`, `do_not_group_on_null_ancestor`
    
  6. from https://stackoverflow.com/questions/4588935/group-by-do-not-group-null by cc-by-sa and MIT license