通过自定义优先级选择列值

问题描述

MysqL 5.7

我有一个3列的表格

ID ->主键

状态->用户状态

MASTERID ->外键

我需要一个选择查询,该查询将使用以下优先级返回用户的状态

已验证-> 1 具有最高优先级

重置-> 2 第二优先级

已创建-> 3 优先级最低

ID STATUS       MASTERID

1   Created      1

2   Verified     1

3   Reset        1

4   Created      1

选择查询应返回 已验证

ID STATUS       MASTERID

1  Reset         1

2  Reset         1

选择查询应返回 重置 ,因为仅存在一种不同的状态

ID STATUS       MASTERID

1  Reset           1

2  Created         1

3  Verified        1

选择查询应返回 已验证 ,因为它具有最高优先级

以上记录是一个用户的示例,同样,我需要获取每个不同用户的状态

解决方法

order byfield()一起使用:

select t.*
from (select t.*,row_number() over (partition by masterid order by field(status,'Verified','Reset','Created') as seqnum
      from t
     ) t
where seqnum = 1;

如果只需要一个主ID的结果,则:

select t.*
from t
where masterid = 1
order by field(status,'Created') 
limit 1;

当然,对于您指定的值,可以将field()替换为status desc。但是,这提供了更通用的解决方案。

编辑:

在MySQL 5.7中,您可以使用:

select t.*
from t
where t.id = (select t2.id
              from t t2
              where t2.masterid = t.masterid 
                    order by field(status,'Created')
              limit 1
             );
,

我假设MASTERID是用户,并且我自由创建了一些示例数据。但是,实际上,OP(也就是您)应该是一个在db-fiddle.com这样的网站上创建示例表和数据的人,如果您以后正在认真寻找某人来回答您的问题。参见Why should I provide a Minimal Reproducible Example for a very simple SQL query?

SELECT MASTERID,CASE
     WHEN RANKING = 1 THEN 'Created'
     WHEN RANKING = 2 THEN 'Reset'
     WHEN RANKING = 3 THEN 'Verified'
  END as STATUS
FROM (
    SELECT MASTERID,MAX(FIELD(STATUS,'Created','Verified')) as RANKING
    FROM mytable
    GROUP bY MASTERID
) SQ;

| MASTERID | STATUS   |
| -------- | -------- |
| 1        | Verified |
| 2        | Reset    |
| 3        | Verified |

View on DB Fiddle

如果您还希望将ID与返回的结果相关联,则:

SELECT * FROM mytable t1
WHERE FIELD(STATUS,'Verified') = (
    SELECT MAX(FIELD(STATUS,'Verified')) FROM mytable t2
    WHERE t2.MASTERID = t1.MASTERID
) AND t1.ID = (
    SELECT MIN(t2.ID) FROM mytable t2
    WHERE t2.MASTERID = t1.MASTERID AND t2.STATUS = t1.STATUS
)


| ID  | STATUS   | MASTERID |
| --- | -------- | -------- |
| 2   | Verified | 1        |
| 5   | Reset    | 2        |
| 9   | Verified | 3        |

View on DB Fiddle