我有表“对象”:
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”不为null的记录,我只想要获取一个。 如果我运行此查询:
select * from objects group by group_id
然后只会显示一个具有特定group_id的记录。问题是那些group_id设置为NULL的记录只会显示一次。 我希望所有记录都与那些将group_id设置为某些内容的记录区分开来。在这种情况下,只有帖子必须出现。
我尝试了不同的东西,例如使用DISTINCT。如果您只选择指定的字段,则区别有效。否则它会获取重复项。 我也尝试过这种方式分组:
group by id desc, group_id desc
在这种情况下,重复项仍会显示。
答案 0 :(得分:2)
处理此问题的一个概念上简单的方法是将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
顺便说一下,我认为SELECT
查询中的GROUP BY
列不是聚合或者正在进行分组的列,这是不好的做法。因此,最好避免使用SELECT *
执行GROUP BY
,并且此样式查询可能无法在其他类型的RDBMS中使用。
<强>更新强>
如果你不能使用上面的查询,那么你可以试试这个:
SELECT *
FROM objects
GROUP BY COALESECE(group_id, name)
这将使用所有name
组的null
字段。当然,这会带来null
具有相同名称的群组仍会聚集在一起的风险。