mysql - MySQL 按空值和非空值分组
问题描述
我有一张这样的桌子:
id | cluster_id | user_id | name | ...
1 | 1 | 1 | test name
2 | 1 | 3 | other
3 | null | 1 | one more
4 | 2 | 1 | foo
5 | null | 1 | bar
6 | 1 | 1 | baz
我想创建一个按cluster_id
列分组的查询,但只按具有非空值的列分组,这样我就得到了这样的结果:
id | cluster_id | user_id | ...
1 | 1 | 1 | test name
3 | null | 1 | one more
4 | 2 | 1 | foo
5 | null | 1 | bar
我想要一个具有不同 cluster_ids 的列表,但仅限于 cluster_id 不为空的地方。我也想过滤任意列,如user_id
.
在上面的结果中,我还查询了user_id
,其中user_id
是 1。
如何创建这样的查询?
提前致谢!
解决方案
查询很简单。
GROUP BY 也适用于 NULL 值
我做了两个查询,第一个包含 user_id 最后一个不包含
您必须以 id 作为主键进行测试,并查看排除 NULL 是否会带来一些性能
CREATE TABLE tab1 ( `id` INTEGER, `cluster_id` int, `user_id` INTEGER, `name` VARCHAR(20) );
INSERT INTO tab1 (`id`, `cluster_id`, `user_id`, `name`) VALUES ('1', '1', '1', 'test name'), ('2', '1', '3', 'other'), ('3', null, '1', 'one more'), ('4', '2', '1', 'foo'), ('5', null, '1', 'bar'), ('6', '1', '1', 'baz');
SELECT * FROM tab1 WHERE `id` IN (SELECT MIN(`id`) FROM tab1 GROUP BY `cluster_id`,`user_id`) UNION SELECT * FROM tab1 WHERE `cluster_id` IS NULL
编号 | cluster_id | 用户 ID | 姓名 -: | ---------: | ------: | :-------- 1 | 1 | 1 | 测试名称 2 | 1 | 3 | 其他 3 | 空| 1 | 多一个 4 | 2 | 1 | 富 5 | 空| 1 | 酒吧
SELECT * FROM tab1 WHERE `id` IN (SELECT MIN(`id`) FROM tab1 WHERE `cluster_id` IS NOT NULL GROUP BY `cluster_id`,`user_id`) UNION SELECT * FROM tab1 WHERE `cluster_id` IS NULL
编号 | cluster_id | 用户 ID | 姓名 -: | ---------: | ------: | :-------- 1 | 1 | 1 | 测试名称 2 | 1 | 3 | 其他 4 | 2 | 1 | 富 3 | 空| 1 | 多一个 5 | 空| 1 | 酒吧
SELECT * FROM tab1 WHERE `id` IN (SELECT MIN(`id`) FROM tab1 GROUP BY `cluster_id`) UNION SELECT * FROM tab1 WHERE `cluster_id` IS NULL
编号 | cluster_id | 用户 ID | 姓名 -: | ---------: | ------: | :-------- 1 | 1 | 1 | 测试名称 3 | 空| 1 | 多一个 4 | 2 | 1 | 富 5 | 空| 1 | 酒吧
SELECT * FROM tab1 WHERE `id` IN (SELECT MIN(`id`) FROM tab1 WHERE `cluster_id` IS NOT NULL GROUP BY `cluster_id`) UNION SELECT * FROM tab1 WHERE `cluster_id` IS NULL
编号 | cluster_id | 用户 ID | 姓名 -: | ---------: | ------: | :-------- 1 | 1 | 1 | 测试名称 4 | 2 | 1 | 富 3 | 空| 1 | 多一个 5 | 空| 1 | 酒吧
db<>在这里摆弄
推荐阅读
- google-apps-script - 如何在 Google 电子表格中使用 onEdit(e) 函数获取日期和时间
- c++ - 纯虚函数中父类的默认值
- python - 如何在 Python 的 Google 工作表中将字符串列表写入单独的行
- javascript - 使用 getServerSideProps 的 NextJS 错误“对象作为反应子无效”
- node.js - 在 Heroku 中使用 log4js
- docker - Docker - 在未指定图像的情况下意外提交,生成一个新图像。如何改为更新旧图像?
- linux - 如何在 Linux 汇编语言中从 STDIN 正确读取文件名?
- javascript - 更改事件之前的 Flickity.js
- javascript - 从路由器中删除查询项
- python - 使用python自动为我的exe文件创建桌面快捷方式