Der kan være tilfælde, hvor der kræves en specifik rækkefølge i en SQL-forespørgsel, som ikke kan udføres ved hjælp af ASC eller DESC eller ved hjælp af et særligt sorteringsfelt. MySQL har en ORDER BY FIELD-funktion, som kan bruges til at gøre dette.
Eksempel data
Eksempel data i dette indlæg bruger min eksempel frugt tabel. Dette er en noget simpel tabel, men den kan bruges til at illustrere pointen i dette indlæg ganske godt.
Rækkefølge efter specifikke feltværdier
Frugttabellen har et “name”-felt med følgende unikke værdier: Æble, Banan, Appelsin, Appelsin, Pære. Hver af disse unikke værdier har et sæt sorter.
Lad os for en god ordens skyld sige, at vi ønsker at ordne dataene i en bestemt rækkefølge efter banan, æble, pære, appelsin og derefter efter deres sorter. Det er ikke muligt at gøre dette ved hjælp af en almindelig ORDER BY-klausul, fordi en stigende eller faldende sortering på dette felt ikke vil fungere. Vi ville enten have brug for en form for sorteringskolonne eller et andet alternativ.
Ved hjælp af funktionen FIELD( ) i ORDER BY-klausulen kan vi opnå dette. Den fungerer ved at angive den kolonne, der skal sorteres efter, og derefter de værdier, der skal sorteres i rækkefølge. For eksempel:
SELECT * FROM fruit ORDER BY FIELD(name, 'Banana', 'Apple', 'Pear', 'Orange'), variety;
De resulterende data fra eksempeltabellen ser således ud:
+----------+--------+---------------------+| fruit_id | name | variety |+----------+--------+---------------------+| 11 | Banana | Burro || 12 | Banana | Cavendish || 10 | Banana | Plantain || 6 | Apple | Cox's Orange Pippin || 7 | Apple | Granny Smith || 1 | Apple | Red Delicious || 8 | Pear | Anjou || 4 | Pear | Bartlett || 2 | Pear | Comice || 5 | Orange | Blood || 3 | Orange | Navel || 9 | Orange | Valencia |+----------+--------+---------------------+
Getka
Der er en lille “gotcha”, når man bruger denne funktion. Alle værdier, der er i kolonnen, som ikke er i FIELD() funktionen, vises i en mere eller mindre tilfældig rækkefølge før de angivne værdier. Hvis du f.eks. kun angiver Apple og Banana:
SELECT * FROM fruit ORDER BY FIELD(name, 'Banana', 'Apple') DESC, variety;
Dette resulterer i:
+----------+--------+---------------------+| fruit_id | name | variety |+----------+--------+---------------------+| 6 | Apple | Cox's Orange Pippin || 7 | Apple | Granny Smith || 1 | Apple | Red Delicious || 11 | Banana | Burro || 12 | Banana | Cavendish || 10 | Banana | Plantain || 8 | Pear | Anjou || 4 | Pear | Bartlett || 5 | Orange | Blood || 2 | Pear | Comice || 3 | Orange | Navel || 9 | Orange | Valencia |+----------+--------+---------------------+
En løsning på gotcha
Selv om du normalt kun vil bruge denne funktion, når de nøjagtige kolonner er kendt, er en løsning at vende rækkefølgen af de angivne felter om og ordne dem i en faldende rækkefølge og derefter foretage en anden sortering på det samme felt.
Det følgende eksempel sorterer, på trods af hvordan det ser ud, faktisk i rækkefølge efter Banana, derefter Apple og derefter de andre navne i stigende rækkefølge:
SELECT * FROM fruit ORDER BY FIELD(name, 'Apple', 'Banana') DESC, name, variety;
Dette resulterer i:
+----------+--------+---------------------+| fruit_id | name | variety |+----------+--------+---------------------+| 11 | Banana | Burro || 12 | Banana | Cavendish || 10 | Banana | Plantain || 6 | Apple | Cox's Orange Pippin || 7 | Apple | Granny Smith || 1 | Apple | Red Delicious || 5 | Orange | Blood || 3 | Orange | Navel || 9 | Orange | Valencia || 8 | Pear | Anjou || 4 | Pear | Bartlett || 2 | Pear | Comice |+----------+--------+---------------------+
Dette kan være en nyttig løsning, hvis et bestemt sæt rækker skal vises før de andre i resultatmængden, men det ville normalt ikke vises først, når du bruger en ASC- eller DESC-sorteringsrækkefølge.