首页 > 解决方案 > 根据列和状态列的组合查询以获取记录

问题描述

我有一张这样的桌子,

+----------+----------+-----------+------------+
|       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] 将不满足条件。

希望我的查询有意义。

标签: mysqlsqldatabasesubquery

解决方案


您可以使用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


推荐阅读