Mysql如何根据优先级选择

时间:2016-12-15 12:02:00

标签: mysql sql select group-by sql-order-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:更改样本数据

2 个答案:

答案 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;

编辑:

如果您只想获得最高状态,请使用JOINGROUP 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)

首先,根据列tablIDstatus的优先级为第二个表提供行号。然后将其与第一个表连接以获取列iddata,并仅选择行号为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