2016-12-15 64 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