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)
答案 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分组的所有