2016-12-15 58 views
1

如何实现这个通过联接和组基部由或任何其他替代mysql如何选择优先

表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

如果你想最近的状态变化,再一个方法是相关子查询:

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是唯一的(一个合理的假设)。

+0

感谢@Gordon最高优先顺序可能会出现。我已经改变了样本数据,你可以建议一个解决方案。 – Abhi

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