Es kann vorkommen, dass in einer SQL-Abfrage eine bestimmte Reihenfolge erforderlich ist, die weder mit ASC oder DESC noch mit einem speziellen Sortierfeld erreicht werden kann. MySQL verfügt über eine Funktion ORDER BY FIELD, mit der dies möglich ist.

Beispieldaten

Die Beispieldaten in diesem Beitrag verwenden meine Beispiel-Obsttabelle. Es handelt sich dabei um eine recht einfache Tabelle, die aber zur Veranschaulichung der in diesem Beitrag genannten Punkte gut geeignet ist.

Anordnung nach bestimmten Feldwerten

Die Obsttabelle hat ein Feld „Name“ mit den folgenden eindeutigen Werten: Apfel, Banane, Orange, Birne. Jeder dieser eindeutigen Werte hat eine Reihe von Sorten.

Angenommen, wir wollen die Daten in einer bestimmten Reihenfolge nach Banane, Apfel, Birne, Orange und dann nach ihren Sorten ordnen. Es ist nicht möglich, dies mit einer normalen ORDER BY-Klausel zu tun, da eine auf- oder absteigende Sortierung nach diesem Feld nicht möglich ist. Wir bräuchten entweder eine Art von Sortierspalte oder eine andere Alternative.

Mit der Funktion FIELD( ) in der ORDER BY-Klausel können wir dies erreichen. Sie funktioniert, indem man die Spalte angibt, nach der sortiert werden soll, und dann die Werte, die in der Reihenfolge sortiert werden sollen. Beispiel:

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

Die resultierenden Daten aus der Beispieltabelle sehen wie folgt aus:

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

Das Problem

Es gibt ein kleines Problem bei der Verwendung dieser Funktion. Alle Werte in der Spalte, die nicht in der Funktion FIELD() enthalten sind, erscheinen in einer mehr oder weniger zufälligen Reihenfolge vor den angegebenen Werten. Wenn Sie zum Beispiel nur Apfel und Banane angeben:

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

Das ergibt:

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

Eine Lösung für das Problem

Obwohl Sie diese Funktion normalerweise nur verwenden würden, wenn die genauen Spalten bekannt sind, besteht eine Lösung darin, die Reihenfolge der angegebenen Felder umzukehren und sie in absteigender Reihenfolge zu sortieren und dann eine zweite Sortierung für dasselbe Feld durchzuführen.

Das folgende Beispiel sortiert trotz seines Aussehens tatsächlich in der Reihenfolge Banana, dann Apple und dann die anderen Namen in aufsteigender Reihenfolge:

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

Das Ergebnis ist:

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

Dies kann eine nützliche Lösung sein, wenn ein bestimmter Satz von Zeilen vor den anderen in der Ergebnismenge erscheinen muss, aber bei Verwendung einer ASC- oder DESC-Sortierreihenfolge normalerweise nicht zuerst erscheinen würde.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.