Mysql 按自定义优先级选择列值

Mysql 按自定义优先级选择列值,mysql,select,Mysql,Select,Mysql 5.7 我有一张三栏的桌子 ID->主键 状态->用户状态 MASTERID->外键 我需要一个select查询,该查询将返回使用低于优先级的用户状态 验证->1具有最高优先级 ID STATUS MASTERID 1 Created 1 2 Verified 1 3 Reset 1 4 Created 1 重置->2第二优先级 已创建->3的优先级最低 ID STATUS MASTERID

Mysql 5.7

我有一张三栏的桌子

ID->主键

状态->用户状态

MASTERID->外键

我需要一个select查询,该查询将返回使用低于优先级的用户状态

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

ID STATUS       MASTERID

1   Created      1

2   Verified     1

3   Reset        1

4   Created      1
重置->2第二优先级

已创建->3的优先级最低

ID STATUS       MASTERID

1   Created      1

2   Verified     1

3   Reset        1

4   Created      1
选择查询应返回已验证的

select查询应返回Reset,因为只存在一个不同的状态

ID STATUS       MASTERID

1  Reset           1

2  Created         1

3  Verified        1
select查询应返回Verified,因为它具有最高优先级

ID STATUS       MASTERID

1   Created      1

2   Verified     1

3   Reset        1

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

使用order by with字段:

如果只需要一个主id的结果:

select t.*
from t
where masterid = 1
order by field(status, 'Verified', 'Reset', 'Created') 
limit 1;
当然,对于您指定的值,您可以将字段替换为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, 'Verified', 'Reset', 'Created')
              limit 1
             );
将订单依据与字段一起使用:

如果只需要一个主id的结果:

select t.*
from t
where masterid = 1
order by field(status, 'Verified', 'Reset', 'Created') 
limit 1;
当然,对于您指定的值,您可以将字段替换为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, 'Verified', 'Reset', 'Created')
              limit 1
             );

我假设MASTERID是用户,并且我已经自由地创建了一些示例数据。但实际上是OP,也就是说,如果你真的想找人在将来回答你的问题,你应该在db-FIDLE.com这样的网站上创建示例表和数据。看

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

SELECT * FROM mytable t1
WHERE FIELD(STATUS, 'Created', 'Reset', 'Verified') = (
    SELECT MAX(FIELD(STATUS, 'Created', 'Reset', '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        |

我假设MASTERID是用户,并且我已经自由地创建了一些示例数据。但实际上是OP,也就是说,如果你真的想找人在将来回答你的问题,你应该在db-FIDLE.com这样的网站上创建示例表和数据。看

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

SELECT * FROM mytable t1
WHERE FIELD(STATUS, 'Created', 'Reset', 'Verified') = (
    SELECT MAX(FIELD(STATUS, 'Created', 'Reset', '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        |

感谢您的回答,您的解决方案是正确的,但不幸的是,我使用的是Mysql 5.7,此版本不支持窗口功能,如果您能在这里帮助我,将非常有用谢谢您的回答,您的解决方案是正确的,但不幸的是,我使用的是Mysql 5.7,此版本不支持窗口功能,如果您能在这里帮助我,我将非常有帮助。请看谢谢您的回答和创建示例表。谢谢您的回答和创建示例表。