2010-05-11 8 views
12

Gibt es eine Möglichkeit, die Reihenfolge bei Verwendung von SELECT WHERE IN() beizubehalten? Verwenden Sie beispielsweise die folgende Abfrage:Wie behalten Sie die Bestellung mit SELECT WHERE IN()?

SELECT id FROM data_table WHERE id IN(56,55,54,1,7); 

Die Ergebnisse werden mit der Standardreihenfolge von ID zurückkommen. 1,7,54,55,56

Wenn ich möchte die Reihenfolge, in der IN verwendet halten: 56,55,54,1,7

Gibt es einen schnellen Weg, um dies in mySQL zu tun oder werden Ich bin gezwungen, es nach dem Code zu bestellen.

Thanks :)

Antwort

37

Verwenden FIND_IN_SET:

ORDER BY FIND_IN_SET(id, '56,55,54,1,7') 
+0

+1 - Ich habe nie darüber nachgedacht. Gute Idee –

+0

Danke! Das war schnell. Es funktioniert perfekt :) – Pepper

+0

Eine Frage, dies bewirkt, dass die Abfrage einen filesort verwendet. Sollte ich mit dieser Methode auf Leistung achten? Oder ist das eine Frage für einen anderen Thread? – Pepper

0

Sie eine UNION tun können, das könnte die Reihenfolge die gleiche Art und Weise zurück.

ABER:

Warum nicht einfach die Anwendung der Ergebnisse neu ordnen, wenn es sie empfängt, anstatt die DB zwingen, es zu tun?

+2

Die DB wird die Bestellung weit besser skalieren, als es Ihre Anwendung jemals könnte. 10 Datensätze sind nichts - was ist, wenn die Ergebnismenge 10.000 oder Millionen beträgt? –

2
+0

Dies funktioniert nicht wie erwartet. Die Reihenfolge der übergebenen Liste wird nicht beachtet, wenn die Liste eine gemischte Reihenfolge hat (nicht alle Halbmond oder Halbmond), sondern "FIND_IN_SET" stattdessen die exakte Reihenfolge der Liste respektiert – WonderLand