2016-04-26 4 views
0

Ich habe 1 Tabelle mit Namen und Sprache Spalten.Überprüfen und wählen Sie Zeile 2, wenn Zeile 1 nicht existiert. Mysql

Angenommen, ich habe 2 Sprachen mit ID 1 und 2 Ich möchte den ganzen Namen mit Sprache = 2 auswählen, wenn eine Zeile in Sprache = 2 nicht verfügbar ist, dann wähle ich den mit Sprache 1. Nur erhalten Sie die Zeile mit language = 1, wenn language = 2 nicht verfügbar

ID language name(as code) 
1 1  name_1 
2 2  name_1 
3 1  name_2 

ich so etwas zu bekommen:

ID language name 
1 2  name_1 
3 1  name_2 

Vielen Dank für Ihre Hilfe. Entschuldigung für mein Englisch

Antwort

0

Dies ist eine Priorisierungsanfrage. Hier ist eine Methode, die ziemlich schnell ist (vor allem mit der richtigen Indizes):

select t.* 
from t 
where language = 2 
union all 
select t.* 
from t 
where language = 1 and 
     not exists (select 1 from t t2 where t2.language = 1 and t2.name = t.name); 

Dies wird umständlich mit mehr als 2 Sprachen. Dafür können Sie order by und Variablen verwenden:

select t.* 
from (select t.*, 
      (@rn := if(@n = name, @rn + 1, 
         if(@n := name, 1, 1) 
         ) 
      ) as rn 
     from t cross join 
      (select @n := '', @rn := 0) params 
     order by t.name, 
       (case when language = 2 then 1 else 2 end) 
    ) t 
where rn = 1; 

Sie passen nur die order by Klausel die Sprachen in setzen, was Priorität gewünschten Reihenfolge.

+0

Danke Gordon. Ich habe versucht, erste Abfrage und es gibt 1 Zeile mit Sprache = 2 – Thelearning

+0

Was denken Sie, wenn wir Namen in allen Sprachen erhalten und filtern Ergebnis in PHP-Schleife? Wie steht es mit der Leistung? Danke – Thelearning

+0

@Gordon, es ist ein Fehler in Ihrer ersten Abfrage, es sollte 'nicht existiert (wählen Sie 1 von t t2 wo t2.language = 2 und t2.name = t.name);' statt 't2.language = 1' – Solarflare

Verwandte Themen