Für die Aufzeichnung
SELECT * FROM mytable WHERE id IN (1,2,3,4) ORDER BY FIELD(id,3,2,1,4);
sollte auch funktionieren, da Sie die Liste in der WHERE
Klausel nicht bestellen müssen
Wie es funktioniert,
FIELD () ist eine Funktion, die die Indexposition einer durch Kommas getrennten Liste zurückgibt, wenn der gesuchte Wert existiert.
- WENN id = 1, dann gibt FIELD (id, 3,2,1,4) 3 zurück (Position, an der 1 in der Liste steht)
- WENN id = 2, dann gibt FIELD (id, 3,2,1,4) 2 zurück (Position, an der 2 in der Liste steht)
- WENN id = 3, dann gibt FIELD (id, 3,2,1,4) 1 zurück (Position, an der 3 in der Liste steht)
- WENN id = 4, dann gibt FIELD (id, 3,2,1,4) 4 zurück (Position, an der 4 in der Liste steht)
- WENN id = irgendetwas anderes, dann gibt FIELD (id, 3,2,1,4) 0 zurück (nicht in der Liste)
Die ORDER BY
Werte werden von dem ausgewertet, was FIELD () zurückgibt
Sie können alle Arten von ausgefallenen Bestellungen erstellen
Zum Beispiel mit der Funktion IF ()
SELECT * FROM mytable
WHERE id IN (1,2,3,4)
ORDER BY IF(FIELD(id,3,2,1,4)=0,1,0),FIELD(id,3,2,1,4);
Dadurch werden die ersten 4 IDs oben in der Liste angezeigt. Andernfalls wird sie unten angezeigt. Warum?
In der ORDER BY
erhält man entweder 0 oder 1.
- Wenn die erste Spalte 0 ist, lassen Sie eine der ersten 4 IDs erscheinen
- Wenn die erste Spalte 1 ist, lassen Sie sie danach erscheinen
Lassen Sie es uns mit DESC in der ersten Spalte spiegeln
SELECT * FROM mytable
WHERE id IN (1,2,3,4)
ORDER BY IF(FIELD(id,3,2,1,4)=0,1,0) DESC,FIELD(id,3,2,1,4);
In der ORDER BY
erhält man entweder noch 0 oder 1.
- Wenn die erste Spalte 1 ist, stellen Sie sicher, dass nur die ersten 4 IDs angezeigt werden.
- Wenn die erste Spalte 0 ist, lassen Sie die ersten 4 IDs in der ursprünglichen Reihenfolge erscheinen
IHRE AKTUELLE FRAGE
Wenn Sie diesbezüglich ernsthafte Interna wünschen, lesen Sie die Seiten 189 und 192 des Buches
für einen tiefen tauchgang.
Im Wesentlichen gibt es eine C ++ - Klasse namens ORDER *order
(Der ORDER BY
Ausdrucksbaum). In JOIN::prepare
, *order
wird in einer aufgerufenen Funktion verwendet setup_order()
. Warum mitten in der JOIN
Klasse? Jede Abfrage, auch eine Abfrage für eine einzelne Tabelle, wird immer als JOIN verarbeitet. (Siehe meinen Beitrag. Gibt es einen Ausführungsunterschied zwischen einer JOIN-Bedingung und einer WHERE-Bedingung? )
Der Quellcode für all das ist sql/sql_select.cc
Offensichtlich wird der ORDER BY
Baum die Bewertung von enthalten FIELD(id,3,2,1,4)
. Somit sind die Zahlen 0, 1, 2, 3, 4 die Werte, die sortiert werden, während ein Verweis auf die betreffende Zeile geführt wird.
SELECT *, FIELD(id,3,2,1,4) AS f FROM mytable WHERE id IN (3,2,1,4);
Fügen Sie dannORDER BY f
oder hinzuORDER BY FIELD(id,3,2,1,4)
und versuchen Sie es erneut.