Frage

Ist es möglich, eine SELECT-Anweisung mit einer vorbestimmten Reihenfolge, also zu tun. IDs 7,2,5,9 und 8 und Rückkehr sie in dieser Reihenfolge , bezogen auf nichts anderes als das ID-Feld der Auswahl?

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

War es hilfreich?

Lösung

Ich glaube nicht, dass dies möglich war, aber ein Blog-Eintrag hier das scheint zu tun, um die Art der Sache Sie nach:

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

wird unterschiedliche Ergebnisse zu

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 gibt die Position von id im zweiten Argument, um es gegeben, so dass für den ersten Fall, id von 7 an der Position 1 in der Menge enthalten ist, 2 in 2 und so weiter - mysql intern klappt so etwas wie

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

dann Aufträge durch die Ergebnisse der FIND_IN_SET.

Andere Tipps

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

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

ist alle Ordnung durch die ORDER BY Schlüsselwörter fertig sind, können Sie jedoch nur dann aufsteigend sortieren und absteigend. Wenn Sie eine Sprache wie PHP verwenden, können Sie dann sortieren sie einen Code entsprechend verwenden, aber ich glaube es nicht mit MySQL allein möglich ist.

Das funktioniert in Oracle. Können Sie etwas ähnliches in MySql tun?

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

Sie müssen möglicherweise eine temporäre Tabelle mit einem Autofeld erstellen und in sie in der gewünschten Reihenfolge ein. Dann sortiert auf das neue Autowert-Feld.

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.

Es ist Hacky (und wahrscheinlich auch langsam), aber man kann die Wirkung mit UNION bekommt 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 Menschen die FIND_IN_SET Funktion genannt, die dokumentiert ist hier .

Sie erhalten Antworten schnell hier, nicht wahr ...

Der Grund, warum ich diese gefragt habe, ist, dass es der einzige Weg ist, kann ich mich vorstellen ein komplexes mehrdimensionales Array zu vermeiden Sortierung. Ich sagte nicht, es sei schwierig zu sortieren, aber wenn es einen einfacheren Weg, um es mit geraden SQL zu tun, warum dann nicht.

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 OK für eine kleine Gruppe von Werten.

Best ich denken kann, ist eine zweite Säule orderColumn fügt hinzu:

7 1
2 2
5 3
9 4 
8 5

Und dann einfach eine ORDER BY orderColumn

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top