2016-06-24 19 views
0

Ich habe eine Tabelle mit etwa 3 Millionen Zeilen, die aus Städten besteht, die Länder, in denen die Stadt liegt und einige andere Daten.MySQL Wählen Sie zeigen bestimmte Spaltenwerte zuerst

Ich möchte zum Beispiel begrenzte Zeilen abrufen, wo der Name der Stadt mit einer bestimmten Zeichenfolge beginnt, aber listet diejenigen auf, die zuerst in einem bestimmten Land liegen.

Ich habe versucht, sie durch Land <> "uns" zu bestellen, was sehr langsam ist, da der Server alle gefundenen Zeilen sortieren muss, bevor das Limit angewendet wird.

Nun kam ich mit folgenden Aussage auf:

(SELECT * FROM cities WHERE city LIKE "ab%" AND country = "at" LIMIT 5) 
UNION 
(SELECT * FROM cities WHERE city LIKE "ab%" LIMIT 5) 
LIMIT 5 

Es ist sehr schnell mit jedem Präfixlänge aber es sieht ein bisschen schmutzig.

Gibt es einen effizienteren Weg, dies zu tun?

+0

Ich denke, das ist so gut wie es geht. – Barmar

+0

Ich folge nicht der Logik der Abfrage. Warum bewerben Sie 'LIMIT 5' auch nach außen, wenn Sie bereits nur 10 Datensätze haben? –

+1

@TimBiegeleisen Weil er nur 5 Reihen im Endergebnis haben will. Wenn es weniger als 5 Zeilen von "at" gibt, möchte er die verbleibenden Slots aus anderen Ländern füllen. – Barmar

Antwort

0
select top 5 * 
, case when country = 'ab' then 1 
    else 0 end as rnk 
from cities 
where lower(city) like 'ab%' 
or country = 'ab' 
order by rnk desc; 
+0

Dies ist nicht MySQL. Wie auch immer, diese Abfrage benötigt immer noch den Server, um das Ergebnis zu sortieren, was wiederum sehr langsam ist mit so vielen Zeilen in der Tabelle. – Megatron