GROUP BY - do not group NULL

后端 未结 6 1017
名媛妹妹
名媛妹妹 2020-12-05 03:48

I\'m trying to figure out a way to return results by using the group by function.

GROUP BY is working as expected, but my question is: Is it possible to have group b

相关标签:
6条回答
  • 2020-12-05 04:26

    GROUP BY IFNULL(required_field, id)

    0 讨论(0)
  • 2020-12-05 04:27

    Maybe faster version of previous solution in case you have unique identifier in table1 (let suppose it is 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`
    
    0 讨论(0)
  • 2020-12-05 04:31

    Perhaps you should add something to the null columns to make them unique and group on that? I was looking for some sort of sequence to use instead of UUID() but this might work just as well.

    SELECT `table1`.*, 
        IFNULL(ancestor,UUID()) as unq_ancestor
        GROUP_CONCAT(id SEPARATOR ',') AS `children_ids`
    FROM `table1` 
    WHERE (enabled = 1) 
    GROUP BY unq_ancestor
    
    0 讨论(0)
  • 2020-12-05 04:32

    When grouping by column Y, all rows for which the value in Y is NULL are grouped together.

    This behaviour is defined by the SQL-2003 standard, though it's slightly surprising because NULL is not equal to NULL.

    You can work around it by grouping on a different value, some function (mathematically speaking) of the data in your grouping column.

    If you have a unique column X then this is easy.


    Input

    X      Y
    -------------
    1      a
    2      a
    3      b
    4      b
    5      c
    6      (NULL)
    7      (NULL)
    8      d
    

    Without fix

    SELECT GROUP_CONCAT(`X`)
      FROM `tbl`
     GROUP BY `Y`;
    

    Result:

    GROUP_CONCAT(`foo`)
    -------------------
    6,7
    1,2
    3,4
    5
    8
    

    With fix

    SELECT GROUP_CONCAT(`X`)
      FROM `tbl`
     GROUP BY IFNULL(`Y`, `X`);
    

    Result:

    GROUP_CONCAT(`foo`)
    -------------------
    6
    7
    1,2
    3,4
    5
    8
    

    Let's take a closer look at how this is working

    SELECT GROUP_CONCAT(`X`), IFNULL(`Y`, `X`) AS `grp`
      FROM `tbl`
     GROUP BY `grp`;
    

    Result:

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

    If you don't have a unique column that you can use, you can try to generate a unique placeholder value instead. I'll leave this as an exercise to the reader.

    0 讨论(0)
  • 2020-12-05 04:34

    To union multiple table and group_concat different column and sum of column for (unique primary or foreign key) column to display value in same row

    select column1,column2,column3,GROUP_CONCAT(if(column4='', null, column4)) as 
    column4,sum(column5) as column5
    from (
          select column1,group_concat(column2) as column2,sum(column3 ) as column3,'' as 
          column4,'' as column5
          from table1 
          group by column1
    
          union all
    
          select column1,'' as column2,'' as column3,group_concat(column4) as 
          column4,sum(column5) as column5
          from table 2 
          group by column1
         ) as t
         group by column1
    
    0 讨论(0)
  • 2020-12-05 04:36
    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
    
    0 讨论(0)
提交回复
热议问题