MySQL Group By和Skip Grouping on Null Values

时间:2014-03-13 04:28:51

标签: mysql sql null group-by skip

select * from dc_deal group by collection_id

在collection_id列中,我有值(1,3,3,4,4,5,NULL,NULL)。上面的查询将返回(1,2,3,4,NULL)的行,但我想跳过对NULL值的分组,需要结果如(1,2,3,4,NULL ,NULL)

3 个答案:

答案 0 :(得分:8)

如果表中有一个唯一的列(或列集),那么我们可以向GROUP BY添加另一个表达式。

collection_id为空时,表达式需要为每一行返回唯一值。否则,它返回一个常量。

假设表格中有一个唯一的id列,那么我们可以这样做:

... GROUP BY collection_id, IF(collection_id IS NULL, id, 0)

GROUP BY不为空时,0中的第二个表达式返回一个常量值collection_id。但是当collection_id为null时,它会为每一行返回一个唯一值。

请注意,id这里只是对在表中定义为唯一的列的引用。 PRIMARY KEY是一个很好的候选人。如果我们在单个列上没有唯一索引,那么我们可以为唯一约束中的每个列重复这种相同类型的表达式,或者对每行保证唯一的任何表达式重复。

... GROUP BY collection_id
           , IF(collection_id IS NULL, col1, '')
           , IF(collection_id IS NULL, col2, NULL)
           , IF(collection_id IS NULL, col3, collection_id)

或者,我们可以使用表达式生成唯一值:

... GROUP BY IFNULL(collection_id,UUID())

答案 1 :(得分:1)

试试这个:

SELECT * FROM dc_deal 
GROUP BY collection_id, 
case WHEN collection_id IS NULL THEN ID ELSE 0 END

ID替换为表格中的另一列以进行分组。

请参阅SQL Fiddle中的示例。

答案 2 :(得分:-1)

尝试一下:
 从dc_deal中选择*,其中collection_id不是按collection_id分组的所有

MySQL SELECT only not null values