2009-08-26 15 views
53

Ich habe ein PHP-Array mit Nummern von IDs drin. Diese Nummern sind bereits bestellt.MySQL ORDER BY IN()

Jetzt möchte ich mein Ergebnis über die IN() -Methode erhalten, um alle IDs zu bekommen.

Diese IDs sollten jedoch wie in der IN-Methode geordnet werden.

Zum Beispiel:

IN(4,7,3,8,9) 

Sollte ein Ergebnis wie geben:

4 - Article 4 
7 - Article 7 
3 - Article 3 
8 - Article 8 
9 - Article 9 

Irgendwelche Vorschläge? Vielleicht gibt es eine Funktion, dies zu tun?

Danke!

+0

Welche anderen Daten sind mit diesen Nummern verbunden? Es könnte uns einen Hinweis geben, warum Sie es in dieser Reihenfolge wollen. – Randell

Antwort

125

ich denke, Sie Funktion können suchen FIELD - während normalerweise als String-Funktion gedacht, es funktioniert für Zahlen auch in Ordnung!

ORDER BY FIELD(field_name, 3,2,5,7,8,1) 
+1

Genau. Ich habe gerade in Paul Dubois MySQL-Kochbuch gesucht und gefunden: SELECT ID, Name FROM Artikel WHERE ID IN (7,4,21) ORDER BY FELD (ID, 7,4,21) Vielen Dank! –

+0

Darn Sie Leute sind schnell. ;-) – deceze

+0

@Henk, glücklich, dass ich dir geholfen habe, aber eine Annahme ohne Upvote ist ein wirklich merkwürdiges Vorkommnis auf SO - aus welchem ​​Grund auch immer hast du mich nicht belohnt? -) –

-3

Sie müssen nur die richtige Reihenfolge durch Erklärung geben.

SELECT ID FROM myTable WHERE ID IN(1,2,3,4) ORDER BY ID 

Warum möchten Sie Ihre Daten wie in Ihrem Beispiel ungeordnet bestellen lassen?

Wenn Sie nicht lange Abfragen dagegen concatening, versucht auf diese Weise:

SELECT ID FROM myTable WHERE ID=1 
UNION 
SELECT ID FROM myTable WHERE ID=3 
UNION 
SELECT ID FROM myTable WHERE ID=2 
+0

Danke. Aber das wird nicht den Trick: SELECT ID, Name FROM Artikel WHERE ID IN (7,4,21) ORDER BY ID Sollte zeigen, 7,4,21. Aber stattdessen wird es zeigen: 4,7,21 ... –

+2

Union tut * nicht * Garantieauftrag. – paxdiablo

+0

Richtig, also mein zweiter Schuss, wird die gewünschte 'Bestellung' geben, ist aber nicht die süßeste Sache. –

0

Standard-SQL bietet keine Möglichkeit, dies zu tun (MySQL kann, aber ich ziehe es Lösungen, die herstellerneutral sind so I kann das DBMS jederzeit wechseln.

Dies ist etwas, was Sie in der Nachbearbeitung tun sollten nach die Ergebnismenge zurückgegeben wird. SQL kann sie nur in einer Reihenfolge zurückgeben, die in der "order by" -Klausel angegeben ist (oder in beliebiger Bestellung, wenn es keine solche Klausel gibt). Die andere Möglichkeit (obwohl ich es nicht mag, ich habe die Ehre, Ihnen die Wahl zu geben) besteht darin, mehrere Reisen in die Datenbank zu machen, eine für jede ID, und sie so zu verarbeiten, wie sie kommen:

select * from tbl where article_id = 4; 
// Process those. 
select * from tbl where article_id = 7; 
// Process those. 
: : : : : 
select * from tbl where article_id = 9; 
// Process those. 
+0

Sie können es in Standard-SQL mit 'CASE col WHEN * 1st-val * DANN 1 WENN * 2nd-val * DANN 2 ... END' – derobert

+1

... nicht, dass ich so etwas empfehlen würde! – derobert

8

könnten Sie FIELD() verwenden:

ORDER BY FIELD(id, 3,2,5,7,8,1) 

Gibt den Index (Position) von str in der STR1, STR2, str3, ... Liste. Gibt 0 zurück, wenn str nicht gefunden wurde.

Es ist ein bisschen ein hässlicher Hack, also verwenden Sie es wirklich nur, wenn Sie keine andere Wahl haben. Das Sortieren der Ausgabe in Ihrer App ist möglicherweise besser.