2016-12-15 4 views
1

Wie dies zu erreichen, schließt sich und die Gruppe durch oder anderen alternativenMysql wie Basis aus, auf Priorität

Tab 1:

id | data 
1 | aaa 
2 | bbb 
3 | ccc 

Tab 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 

erforderliche Ausgabe:

id | data | status 
1 | aaa | Z 
2 | bbb | Z 
3 | ccc | X 

Rekord mit dem höchsten Prioritätsstatus hat im Ergebnis zu kommen Z > Y > X

Ich möchte eine separate Tabelle zu vermeiden, die Schaffung der Prioritätsreihenfolge

Edit 1 zu speichern: in Wechseldatenprobe

Antwort

0

Wenn Sie die aktuellste Status möchten, dann ist eine Methode, eine korrelierte Unterabfrage:

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:

Wenn Sie nur den höchsten Status möchten, verwenden JOIN und GROUP BY:

select t1.*, max(t2.status) 
from tab1 t1 left join 
    tab2 t2 
    on t2.tab1id = t1.id 
group by t1.id; 

Hinweis: Die Verwendung von select t1.* erlaubt ist und auch von dem ANSI-Standard unterstützt wird, unter der Annahme, dass t1.id einzigartig ist (eine vernünftige Annahme).

+0

dank @Gordon höchste Prioritätsreihenfolge kann auftreten. Ich habe die Beispieldaten ändern können Sie eine Lösung vorschlagen. – Abhi

0

Geben Sie zuerst der zweiten Tabelle eine Zeilennummer basierend auf den Spalten tablID und der Priorität status. Dann kommen sie mit der ersten Tabelle werden die Spalten id und data und wählen Sie nur die Zeilen mit Zeilennummer zu erhalten, ist 1.

Abfrage

 
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

Verwandte Themen