Det kan finnas tillfällen då en specifik ordning krävs i en SQL-fråga som inte kan göras med hjälp av antingen ASC eller DESC eller med hjälp av ett speciellt sorteringsfält. MySQL har en ORDER BY FIELD-funktion som kan användas för att göra detta.

Exempeluppgifter

Exempeluppgifterna i det här inlägget använder min exempelfrukttabell. Detta är en ganska enkel tabell men den kan användas för att illustrera poängen i det här inlägget ganska bra.

Sortering efter specifika fältvärden

Frukttabellen har ett fält ”name” med följande unika värden: Äpple, Banan, Apelsin, Päron. Var och en av dessa unika värden har en uppsättning sorter.

Vad sägs om att vi vill ordna uppgifterna i en specifik ordning efter banan, äpple, päron, apelsin och sedan efter deras sorter. Det är inte möjligt att göra detta med en vanlig ORDER BY-klausul eftersom en stigande eller fallande sortering på detta fält inte fungerar. Vi skulle antingen behöva någon form av sorteringskolumn eller ett annat alternativ.

Med hjälp av funktionen FIELD( ) i ORDER BY-klausulen kan vi uppnå detta. Den fungerar genom att ange den kolumn som ska sorteras efter och sedan de värden som ska sorteras i ordning. Till exempel:

SELECT * FROM fruit ORDER BY FIELD(name, 'Banana', 'Apple', 'Pear', 'Orange'), variety;

Den resulterande datan från exempeltabellen ser ut så här:

+----------+--------+---------------------+| 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 |+----------+--------+---------------------+

Getchan

Det finns en liten ”gotcha” när man använder den här funktionen. Alla värden i kolumnen som inte finns i FIELD()-funktionen kommer att visas i en mer eller mindre slumpmässig ordning före de angivna värdena. Om du till exempel bara anger Apple och Banana:

SELECT * FROM fruit ORDER BY FIELD(name, 'Banana', 'Apple') DESC, variety;

Detta resulterar 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”

Och även om du normalt sett bara använder den här funktionen när du känner till de exakta kolumnerna är en lösning att vända på ordningen för de angivna fälten och ordna dem i fallande ordning, och sedan göra en andra sortering på samma fält.

Trots hur det ser ut sorterar följande exempel i själva verket i ordning efter Banana, sedan Apple och sedan de andra namnen i stigande ordning:

SELECT * FROM fruit ORDER BY FIELD(name, 'Apple', 'Banana') DESC, name, variety;

Detta resulterar 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 |+----------+--------+---------------------+

Det här kan vara en användbar lösning om en viss uppsättning rader måste visas före de andra i resultatuppsättningen, men den skulle normalt inte visas först när man använder en ASC- eller DESC-sorteringsordning.

Lämna ett svar

Din e-postadress kommer inte publiceras.