MySQL ORDER BY in verschiedene Richtungen

order-by

Manchmal kommt man in die Lage, die Ausgabe einer MySQL Tabelle je nach Fall auf- oder absteigend sortieren zu wollen. Wenn man sich hier nicht gut mit der Materie und der Syntax auskennt, kann es eine ganze Weile dauern, bis man sich die richtige Lösung heraus gesucht hat.
Hier möchte ich zeigen, wie eine solche Sortierung in verschiedene Richtungen möglich ist.

Das Problem

Ich hatte das Problem, dass ich Ergebnisse eines Leichtathletikvereins in einer Datenbank hatte, diese aber je nach Ergebnisart eine unterschiedliche Sortierrichtung benötigen.
Sortiert werden sollte nach Disziplinen und die besten Ergebnisse in der jeweiligen Disziplin sollten immer oben stehen. Bei Sprints ist dies das kleinste Ergebnis, bei Sprung- und Wurfdisziplinen hingegen das größte Ergebnis. Also muss einmal aufsteigend (ASC) und einmal absteigend (DESC) sortiert werden.

Die Lösung

Die Lösung liegt in der CASE Anweisung für das ORDER BY von MySQL.
Da die Ergebnisse, die ich absteigend ausgeben muss, immer auf ein m (für Meter) enden, die aufsteigend zu sortierenden aber nicht, konnte ich nach diesem Fall unterscheiden. Die Syntax für eine solche Fallunterscheidung im ORDER BY sieht wie folgt aus:

ORDER BY CASE WHEN bedingung THEN spalte END sortierrichtung, CASE WHEN bedingung THEN spalte END sortierrichtung";
Code-Sprache: PHP (php)

Die Lösung für mein Problem muss also so aussehen:

ORDER BY CASE WHEN ergebnis NOT LIKE '' THEN reihenfolge END ASC, CASE WHEN ergebnis NOT LIKE '%m' THEN ergebnis END ASC, CASE WHEN ergebnis LIKE'%m' THEN ergebnis END DESC";
Code-Sprache: PHP (php)

Die ausgegebene Liste wird aufsteigend nach der festgelegten Reihenfolge der Disziplinen sortiert, dieser Fall greift immer, da das Ergebnis niemals leer ist. Wenn nun das Ergebnis nicht auf ein m endet, wird das Ergebnis ebenfalls aufsteigend sortiert. Endet das Ergebnis hingegen auf ein m, so greift Fall 3, der das Ergebnis absteigend sortiert.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert