查询以根据列和状态列的组合获取记录
Query to fetch record based upon a combination of columns and a status column
我有一个这样的table,
+----------+----------+-----------+------------+
| 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 |
+----------+----------+-----------+------------+
我正在尝试查询应该给我一条记录,这样 table 中没有行应该具有相同的“组”和“信息”组合,不会像“进行中。
但是由于我在形成如此复杂的查询方面知识有限,所以我无法取得太大进展。
例如,查询将从 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 中,您可以使用 window 函数执行此操作:
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
。
我有一个这样的table,
+----------+----------+-----------+------------+
| 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 |
+----------+----------+-----------+------------+
我正在尝试查询应该给我一条记录,这样 table 中没有行应该具有相同的“组”和“信息”组合,不会像“进行中。
但是由于我在形成如此复杂的查询方面知识有限,所以我无法取得太大进展。
例如,查询将从 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 中,您可以使用 window 函数执行此操作:
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
。