Mysql如何根据优先级进行选择

Posted

技术标签:

【中文标题】Mysql如何根据优先级进行选择【英文标题】:Mysql how to select base on priority 【发布时间】:2017-05-01 00:42:04 【问题描述】:

如何通过 joins 和 group by 或任何其他替代方法来实现这一点

标签 1:

id | data  
1  | aaa  
2  | bbb  
3  | ccc

标签 2:

id  | tab1ID | status  
101 | 1      | Y  
102 | 2      | Y  
103 | 1      | X  
104 | 2      | X  
105 | 3      | X  
106 | 1      | Z  
107 | 2      | Z  

需要的输出:

id | data | status  
1 | aaa |  Z  
2 | bbb |  Z  
3 | ccc |  X  

具有最高优先级状态的记录必须出现在结果中Z > Y > X

我想避免创建单独的表来存储优先顺序

编辑1:样本数据的变化

【问题讨论】:

【参考方案1】:

首先,根据列tablIDstatus 的优先级为第二个表指定行号。然后将其与第一个表连接,得到iddata 列,并只选择行号为1 的行。

查询

选择 t1.`id`, t1.`data`, t2.`status` 从 `tab1` t1 左连接( 选择`id`,`tab1ID`,`status`, ( @curA 时的 case `tab1ID` 然后@curRow := @curRow + 1 否则 @curRow := 1 和 @curA := `tab1ID` 结束 ) 作为 rn 从`tab2`, (选择@curRow := 0, @curA := '') r 按“tab1ID”排序,“Z”时为“状态”,然后为 1 当 'Y' 然后 2 当 'X' 然后 3 else 4 结束 )t2 在 t1.`id` = t2.`tab1ID` 其中 t2.rn = 1;

SQL Fiddle Demo

【讨论】:

【参考方案2】:

如果您想要最近的状态,那么一种方法是关联子查询:

select t1.*,
       (select t2.status
        from tab2 t2
        where t2.tab1id = t1.id
        order by t2.id desc
        limit 1
       ) as status
from tab1 t1;

编辑:

如果你只是想要最高的地位,使用JOINGROUP BY

select t1.*, max(t2.status)
from tab1 t1 left join
     tab2 t2
     on t2.tab1id = t1.id
group by t1.id;

注意:假设t1.id 是唯一的(合理的假设),ANSI 标准允许甚至支持使用select t1.*

【讨论】:

感谢@Gordon 最高优先级顺序可能会出现。我已经更改了示例数据,您可以提出解决方案吗?

以上是关于Mysql如何根据优先级进行选择的主要内容,如果未能解决你的问题,请参考以下文章

如何使用优先队列根据键值对的值进行排序

CSSCSS 特性 ③ ( CSS 优先级 | 权重叠加计算公式 )

根据优先级参考表选择列值?

如何根据优先级升序排列待办事项列表

project中资源自动调配顺序

移动优先 - 如何根据会话对日志进行分段