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.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.