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】:首先,根据列tablID
和status
的优先级为第二个表指定行号。然后将其与第一个表连接,得到id
和data
列,并只选择行号为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;
编辑:
如果你只是想要最高的地位,使用JOIN
和GROUP 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如何根据优先级进行选择的主要内容,如果未能解决你的问题,请参考以下文章