如何通过加入和分组或任何其他替代方式实现此目的
标签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:更改样本数据
答案 0 :(得分:0)
如果您想要最新状态,则一个方法是相关子查询:
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;
注意:允许使用select t1.*
,甚至ANSI标准支持,假设t1.id
是唯一的(合理的假设)。
答案 1 :(得分:0)
首先,根据列tablID
和status
的优先级为第二个表提供行号。然后将其与第一个表连接以获取列id
和data
,并仅选择行号为1的行。
<强>查询强>
select t1.`id`, t1.`data`, t2.`status` from `tab1` t1 left join( select `id`, `tab1ID`, `status`, ( case `tab1ID` when @curA then @curRow := @curRow + 1 else @curRow := 1 and @curA := `tab1ID` end ) as rn from `tab2`, (select @curRow := 0, @curA := '') r order by `tab1ID`, case `status` when 'Z' then 1 when 'Y' then 2 when 'X' then 3 else 4 end )t2 on t1.`id` = t2.`tab1ID` where t2.rn = 1;
<强> SQL Fiddle Demo
强>