2008-09-25 13 views
14

Ist es möglich, eine SELECT-Anweisung mit einer vorgegebenen Reihenfolge, dh zu tun. Wählen Sie die IDs 7,2,5,9 und 8 und geben Sie diese in der Reihenfolge zurück, basierend auf nichts anderem als dem ID-Feld?Zurückgegebene Abfrageergebnisse in vordefinierte Reihenfolge

Anweisungen SELECT ID FROM Tabelle WHERE ID in (7,2,5,9,8); und SELECT ID FROM Tabelle WHERE ID in (8,2,5,9,7); beide geben sie in der gleichen Reihenfolge zurück.

+0

Der Titel dieser Frage ist unklar. Bitte bearbeiten Sie es, damit Personen, die an der Frage vorbeiscrollen, es verstehen können. –

Antwort

34

Ich glaube nicht, das möglich war, fand aber eine blog entry here, die die Art der Sache zu tun scheint, Sie sind nach:

SELECT id FROM table WHERE id in (7,2,5,9,8) 
ORDER BY FIND_IN_SET(id,"7,2,5,9,8"); 

unterschiedliche Ergebnisse

SELECT id FROM table WHERE id in (7,2,5,9,8) 
ORDER BY FIND_IN_SET(id,"8,2,5,9,7"); 

FIND_IN_SET geben gibt die Position id im zweiten Argument zurück, so dass für den ersten obigen Fall id von 7 an Position 1 im Satz, 2 an 2 usw. ist - mysql ergibt intern etwa

id | FIND_IN_SET 
---|----------- 
7 | 1 
2 | 2 
5 | 3 

dann Bestellungen nach den Ergebnissen von FIND_IN_SET.

+0

Angenommen, das funktioniert, es ist eine wirklich nette Lösung. – JosephStyons

+0

Getestet auf v5 hier, und es funktioniert gut! Der oben verlinkte Blog erwähnt einen komplizierteren Satz von Abfragen, wo er vielleicht noch nützlicher ist. – ConroyP

+0

Es funktioniert, und es ist großartig. :-) – ceejayoz

0

Die gesamte Sortierung erfolgt über die ORDER BY-Schlüsselwörter, Sie können jedoch nur aufsteigend und absteigend sortieren. Wenn Sie eine Sprache wie PHP verwenden, können Sie sie entsprechend mit einem Code sortieren, aber ich glaube nicht, dass dies nur mit MySQL möglich ist.

0

Dies funktioniert in Oracle. Kannst du etwas Ähnliches in MySql machen?

SELECT ID_FIELD 
FROM SOME_TABLE 
WHERE ID_FIELD IN(11,10,14,12,13) 
ORDER BY 
    CASE WHEN ID_FIELD = 11 THEN 0 
     WHEN ID_FIELD = 10 THEN 1 
     WHEN ID_FIELD = 14 THEN 2 
     WHEN ID_FIELD = 12 THEN 3 
     WHEN ID_FIELD = 13 THEN 4 
    END 
1

Könnten Sie umfassen einen Fall Ausdruck, Ihre IDs 7,2,5 abbildet, ... zu den ordinals 1,2,3, ... und dann, um von diesem Ausdruck?

0

Möglicherweise müssen Sie eine temporäre Tabelle mit einem Feld für automatische Nummerierung erstellen und in der gewünschten Reihenfolge einfügen. Sortieren Sie dann das neue Feld für die automatische Nummerierung.

0

Es ist Hacky (und wahrscheinlich auch langsam), aber man kann die Wirkung mit UNION bekommen ALL:

SELECT id FROM table WHERE id = 7 
UNION ALL SELECT id FROM table WHERE id = 2 
UNION ALL SELECT id FROM table WHERE id = 5 
UNION ALL SELECT id FROM table WHERE id = 9 
UNION ALL SELECT id FROM table WHERE id = 8; 

Edit: Andere Leute erwähnt die FIND_IN_SET Funktion, die here dokumentiert.

-1

Beste Ich kann mir eine zweite Säule orderColumn Zugabe:

7 1 
2 2 
5 3 
9 4 
8 5 

Und dann einfach eine ORDER BY orderColumn

0

Erm, nicht wirklich. Closest Sie erhalten können, ist wahrscheinlich:

SELECT * FROM table WHERE id IN (3, 2, 1, 4) ORDER BY id=4, id=1, id=2, id=3 

Aber Sie wollen wahrscheinlich nicht, dass :)

Es ist schwer, Ihnen mehr spezifische Beratung ohne weitere Informationen darüber zu geben, was in den Tabellen ist.

2

ORDER BY FIELD (ID, 7,2,4,5,8) ist Ihre beste Wette, aber es ist immer noch hässlich.

0

Sie erhalten Antworten schnell hier, nicht wahr ...

Der Grund, warum ich das bin gefragt ist, dass es der einzige Weg ist, kann ich mir vorstellen ein komplexes mehrdimensionales Array zu vermeiden Sortierung. Ich sage nicht, dass es schwer zu sortieren wäre, aber wenn es einen einfacheren Weg mit geraden SQL geben würde, warum nicht.

0

Eine Oracle-Lösung ist:

SELECT id FROM table WHERE id in (7,2,5,9,8) 
ORDER BY DECODE(id,7,1,2,2,5,3,9,4,8,5,6); 

Dieses ordnet jeder ID eine Bestellnummer. Funktioniert für einen kleinen Satz von Werten.