2016-12-15 8 views
1

にベースを選択する方法MySQLが参加し、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 

最高記録、あなたが最新の状態にしたい場合は、サンプルデータの変化

答えて

0

:優先順位のステータスが、私は優先順位

編集1を格納するために別のテーブルを作成しないようにしたい結果にZ > Y > X

を思い付くことがありますあなただけの最高の状態、使用をしたい場合は

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; 

EDIT:その後、1つの方法は、相関サブクエリですと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.*の使用が許可されてもt1.idは、(合理的な仮定)一意であると仮定すると、ANSI規格によってサポートされています。

+0

おかげで優先順位が上がることがあります。私はサンプルデータを変更して解決策を提案することができます。 – Abhi

0

最初に、列tablIDと優先度statusに基づいて2番目の表に行番号を指定します。その後、列iddataを取得し、行番号を持つ行のみを選択するために、最初のテーブルでそれに参加することは、最高@Gordon 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

関連する問題