Előfordulhat, hogy egy SQL-lekérdezésben olyan meghatározott sorrendre van szükség, amelyet nem lehet ASC vagy DESC vagy egy speciális rendezőmező használatával elérni. A MySQL rendelkezik egy ORDER BY FIELD funkcióval, amelyet erre használhatunk.
Példaadatok
Az ebben a bejegyzésben szereplő példaadatok az én példagyümölcs táblámat használják. Ez egy kissé egyszerű táblázat, de elég jól használható a bejegyzésben foglaltak szemléltetésére.
Sorrendezés meghatározott mezőértékek szerint
A gyümölcsök táblában van egy “név” mező a következő egyedi értékekkel: Alma, Banán, Narancs, Körte. Mindegyik egyedi értékhez tartozik egy sor fajta.
Tegyük fel a vita kedvéért, hogy az adatokat meghatározott sorrendben Banán, Alma, Körte, Narancs, majd ezek fajtái szerint szeretnénk rendezni. Ez nem lehetséges egy hagyományos ORDER BY záradékkal, mert a mező növekvő vagy csökkenő rendezése nem fog működni. Vagy valamilyen rendezési oszlopra, vagy más alternatívára lenne szükségünk.
Az ORDER BY záradékban a FIELD( ) függvényt használva elérhetjük ezt. Úgy működik, hogy megadjuk a rendezni kívánt oszlopot, majd a sorrendbe rendezendő értékeket. Például:
SELECT * FROM fruit ORDER BY FIELD(name, 'Banana', 'Apple', 'Pear', 'Orange'), variety;
A példatábla eredményül kapott adatok így néznek ki:
+----------+--------+---------------------+| 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 |+----------+--------+---------------------+
A gubanc
Egy kis “gubanc” van a függvény használatakor. Az oszlopban lévő minden olyan érték, amely nem szerepel a FIELD() függvényben, többé-kevésbé véletlenszerű sorrendben fog megjelenni a megadott értékek előtt. Például csak az Apple és a Banana megadásával:
SELECT * FROM fruit ORDER BY FIELD(name, 'Banana', 'Apple') DESC, variety;
Az eredmény:
+----------+--------+---------------------+| 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 |+----------+--------+---------------------+
Megoldás a gubancra
Bár ezt a függvényt általában csak akkor használjuk, ha a pontos oszlopok ismertek, megoldás lehet a megadott mezők sorrendjének megfordítása és csökkenő sorrendbe állítása, majd egy második rendezés ugyanazon a mezőn.
A következő példa, annak ellenére, ahogyan kinéz, valójában a Banana, majd az Apple, és utána a többi név sorrendjében, növekvő sorrendben rendezi:
SELECT * FROM fruit ORDER BY FIELD(name, 'Apple', 'Banana') DESC, name, variety;
Az eredmény:
+----------+--------+---------------------+| 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 |+----------+--------+---------------------+
Ez hasznos megoldás lehet, ha a sorok egy adott csoportjának a többi előtt kell megjelennie az eredményhalmazban, de ASC vagy DESC rendezés esetén általában nem jelenne meg elsőként.