mysql - 根据列和状态列的组合查询以获取记录
问题描述
我有一张这样的桌子,
+----------+----------+-----------+------------+
| id | group | info | status |
+----------+----------+-----------+------------+
| 1 | 1 | VALUE123 | EXECUTED |
| 2 | 1 | VALUE123 | INPROGRESS |
| 3 | 1 | VALUE123 | UPLOADED |
| 4 | 1 | VALUE123 | UPLOADED |
| 5 | 1 | VALUE123 | UPLOADED |
| 6 | 1 | VALUE123 | UPLOADED |
| 7 | 2 | VALUE123 | EXECUTED |
| 8 | 2 | VALUE123 | UPLOADED |
| 9 | 2 | VALUE123 | UPLOADED |
| 11 | 2 | VALUE123 | UPLOADED |
| 12 | 2 | VALUE123 | UPLOADED |
| 13 | 2 | VALUE123 | UPLOADED |
+----------+----------+-----------+------------+
我正在尝试进行一个查询,该查询应该给我一条记录,这样表中的任何行都应该具有与“组”和“信息”相同的组合,而不会像“INPROGRESS”那样具有状态。
但由于我在形成如此复杂的查询方面知识有限,因此无法取得太大进展。
例如,查询将为我提供来自 id [7 - 13] 的任何一行的记录,而不是来自行 [1 - 6] 的记录。
原因:由于 id 2 的状态为“INPROGRESS”,行 [1 - 6] 将不满足条件。
希望我的查询有意义。
解决方案
您可以使用not exists
:
select t.*
from mytable t
where not exists (
select 1
from mytable t1
wher t1.grp = t.grp and and t1.info = t.info and t1.status = 'INPROGRESS'
)
或者,在 MySQL 8.0 中,您可以使用窗口函数执行此操作:
select *
from (
select t.*,
max(status = 'INPROGRESS') over(partition by grp, info) as flag
from mytable t
) t
where flag = 0
注意:group
是语言关键字(如group by
),因此不是列名的好选择;我在查询中将其重命名为grp
。
推荐阅读
- python - 在 Python 中,如何在 while 循环中重新启动 for 循环?最远的循环是 while 循环运行 while r < y(整数列表的长度)
- php - php 可以有多种文档类型吗?
- sql - 如何根据状态或最近更新的时间戳获取记录?
- javascript - 如何添加新类并从类继承重构到行为委托设计模式?
- javascript - 损坏的 javascript“显示:无”与一些 SVG 相结合。不知道从哪里开始
- javascript - 将我的第三方 API 的值添加到我的帐户余额状态
- flutter - 如何将 https 替换为 http 以正确显示图像 url?
- json - 处理数组 api json
- c++ - 使用 CreateToolhelp32Snapshot 时出现 Winapi 访问被拒绝错误
- html - CSS“绝对”位置属性应该相对于第一个祖先?