Dla przypomnienia
SELECT * FROM mytable WHERE id IN (1,2,3,4) ORDER BY FIELD(id,3,2,1,4);
powinien również działać, ponieważ nie musisz zamawiać listy w WHERE
klauzuli
Jeśli chodzi o to, jak to działa,
FIELD () to funkcja, która zwraca pozycję indeksu listy rozdzielanej przecinkami, jeśli szukana wartość istnieje.
- JEŻELI id = 1, to FIELD (id, 3,2,1,4) zwraca 3 (pozycja, gdzie 1 jest na liście)
- JEŻELI id = 2, to FIELD (id, 3,2,1,4) zwraca 2 (pozycja, gdzie 2 jest na liście)
- JEŻELI id = 3, to FIELD (id, 3,2,1,4) zwraca 1 (pozycja, gdzie 3 jest na liście)
- JEŻELI id = 4, to FIELD (id, 3,2,1,4) zwraca 4 (pozycja, gdzie 4 jest na liście)
- JEŻELI id = cokolwiek innego, to FIELD (id, 3,2,1,4) zwraca 0 (nie na liście)
Te ORDER BY
wartości są oceniane przez co polu () powraca
Możesz tworzyć różnego rodzaju fantazyjne zamówienia
Na przykład, stosując IF () funkcji
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);
Spowoduje to, że pierwsze 4 identyfikatory pojawią się na górze listy, w przeciwnym razie pojawi się na dole. Czemu?
W ORDER BY
albo dostajesz 0 albo 1.
- Jeśli pierwsza kolumna ma wartość 0, wyświetl dowolne z pierwszych 4 identyfikatorów
- Jeśli pierwsza kolumna to 1, spraw, by pojawiła się później
Odwróćmy to za pomocą DESC w pierwszej kolumnie
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);
W ORDER BY
dalszym ciągu dostajesz 0 lub 1.
- Jeśli pierwsza kolumna to 1, zrób cokolwiek oprócz pierwszych 4 identyfikatorów.
- Jeśli pierwsza kolumna ma wartość 0, spraw, aby pierwsze 4 identyfikatory pojawiały się w oryginalnej kolejności
TWOJA RZECZYWISTA PYTANIE
Jeśli poważnie chcesz mieć na to elementy wewnętrzne, przejdź do stron 189 i 192 Księgi
na głębokie nurkowanie.
Zasadniczo istnieje klasa C ++ o nazwie ORDER *order
( ORDER BY
Drzewo wyrażeń). W JOIN::prepare
, *order
jest używana w funkcji o nazwie setup_order()
. Dlaczego w środku JOIN
klasy? Każde zapytanie, nawet zapytanie dotyczące pojedynczej tabeli, jest zawsze przetwarzane jako JOIN (Zobacz mój post Czy istnieje różnica w wykonywaniu między warunkiem JOIN a warunkiem WHERE? )
Kod źródłowy tego wszystkiego to sql/sql_select.cc
Najwyraźniej ORDER BY
drzewo będzie miało ocenę FIELD(id,3,2,1,4)
. Tak więc liczby 0,1,2,3,4 są wartościami sortowanymi z odniesieniem do danego wiersza.
SELECT *, FIELD(id,3,2,1,4) AS f FROM mytable WHERE id IN (3,2,1,4);
następnie dodajORDER BY f
lubORDER BY FIELD(id,3,2,1,4)
spróbuj ponownie.