问题描述
MysqL 5.7
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 by
与field()
一起使用:
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 |
如果您还希望将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 |