MySQL 分组依据为空

标签 mysql

我有表“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

SQLFiddle

顺便说一下,我认为在 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/

相关文章:

mysql - 连接 2 个表和嵌套选择以对同一字段的不同列进行计数

mysql - EAV vs null vs 混合

java.sql.SQLException : Parameter index out of range (5 > number of parameters, 即 4)

php - mySQL 和 PHP 编码

mysql - 选择哪个哈希函数来索引 mysql 上的 uuid 字符串? md5,crc64 或 fnv

php - 如果否则在更新查询中不起作用

php - 通过匹配日期查询获取详细信息

mysql - 如何将 HeidiSQL(或类似的 MySQL 管理器)与托管数据库一起使用

php - Mysql - 删除组中的数据

php - 简单的登录表单 php 需要帮助