2016-07-31 9 views
1

Ich baue eine MySQL-Abfrage für eine Suchfunktion, jetzt möchte ich das Ergebnis in einer bestimmten Weise mit einem Array von IDs bestellen.MYSQL Order by Field oder Find_in_set ohne IN()

Ich habe in der Lage, dies zu tun, indem sie ein Stück MYSQL ähnlich wie dies mit:

SELECT id, name 
FROM mytable 
WHERE id IN (77, 3, 123, 1) 
ORDER BY FIELD(id, 77, 3, 123, 1) 

Aber ich frage mich, ob es zu Order by FIELD oder durch FIND_IN_SET möglich ist, ohne dass die IN() innerhalb der SELECT-Abfrage einstellen .

Ich will nicht die IN() Anweisung verwenden, weil ich auch Ergebnisse erwarten, die nicht in der Anordnung von

der ID sind

Hoffentlich kann mir jemand in die richtige Richtung schieben,

Danke Voraus,

Antwort

2

Wenn Sie nur eine Auswertung bevorzugen, können Sie Ihre Bestellung in field() umkehren und verwenden

SELECT id, name 
FROM mytable 
ORDER BY FIELD(id, 1, 123, 3, 77) desc 

Es dauert noch wesentlich länger als Ihre ursprüngliche Abfrage, weil field() teurer ist als IN und Sie müssen jetzt field() für jede Zeile auswerten anstatt nur einige Zeilen.

Eine Alternative könnte in Abhängigkeit von der Größe des Arrays

SELECT id, name, FIELD(id, 77, 3, 123, 1) as orderno 
FROM mytable 
WHERE id IN (77, 3, 123, 1) 
union 
SELECT id, name, 99999999 
FROM mytable 
WHERE id NOT IN (77, 3, 123, 1) 
order by orderno, id 

Dies kann schneller zu bedienen sein, aber man würde es testen, könnte es auch schlimmer sein.

+0

Sie sollten "UNION ALL" verwenden, da die beiden Selects definitiv einen leeren Schnittpunkt haben. –

+0

Die erste Methode funktionierte am besten für mich, sie war nur ein paar Millisekunden schneller als mit der NOT IN Abfrage, aber alles zählt: P Vielen Dank für Ihre Antwort und Erklärung! – Lennart

2
SELECT id, name 
FROM mytable 
ORDER BY id NOT IN (77, 3, 123, 1), 
     FIELD(id, 77, 3, 123, 1) 
+0

Erläuterung benötigt. Lerne [Antwort]. –

+0

Das sieht gut zu mir :) – Jordon

+0

Das hat gut funktioniert, aber leider hat es die Ladezeit von langen Abfragen um eine Sekunde oder mehr erhöht. Kennen Sie vielleicht andere Möglichkeiten, dies schneller zu erreichen? – Lennart