我有表“objects”:
id (int)
name (varchar)
group_id (varchar) default null
我做了一些插入:
insert into objects values(null, 'Cat', null);
insert into objects values(null, 'Dog', null);
insert into objects values(null, 'Mouse', 'AAA');
insert into objects values(null, 'Eagle', 'BBB');
insert into objects values(null, 'Elephant', null);
insert into objects values(null, ' Bull', 'AAA');
然后我做这样的选择:
select * from objects
我插入的所有行都会显示出来。但是,对于那些字段“group_id”不为空的记录,我只想获取一个。 如果我运行这个查询:
select * from objects group by group_id
然后只有一个具有特定 group_id 的记录会出现。问题是那些将 group_id 设置为 NULL 的记录只会出现一次。 我希望所有记录都显示出来,除了那些将 group_id 设置为某项的记录。在这种情况下,只有 on post 必须出现。
我尝试过不同的方法,例如使用 DISTINCT。如果您只选择指定的字段,则 Distinct 有效。否则它会获取重复项。 我也试过这样分组:
group by id desc, group_id desc
在那种情况下,重复项仍然会出现。
最佳答案
处理此问题的一个概念上简单的方法是将您的原始查询(稍作修改)UNION
与获取 group_id
为空的所有记录的查询一起:
SELECT * FROM objects WHERE group_id IS NOT NULL GROUP BY group_id
UNION
SELECT * FROM objects WHERE group_id IS NULL
顺便说一下,我认为在 GROUP BY
查询中 SELECT
列是一种不好的做法,这些列既不是聚合也不是进行分组的列。因此,最好避免使用 GROUP BY
执行 SELECT *
,并且此样式查询可能不适用于其他类型的 RDBMS。
更新:
如果你不能使用上面的查询,那么你可以试试这个:
SELECT *
FROM objects
GROUP BY COALESECE(group_id, name)
这将在所有 null
组上使用 name
字段。当然,这样做的风险在于,具有相同 名称的 null
组仍会被聚合。
关于MySQL 分组依据为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33075685/