MySQL - oder wie (Web-) Programmierer denken

Die Aufgabe war wohl dem Programmierer eines Mittbewerbers zu schwierig. Um mit einem Content-Management-System eine Anforderung eines derer Kunden umzusetzen benötigten diese Hilfe bei der Erstellung einer einzigen Datenbankabfrage:

Die Aufgabe:

Es bestand eine Tabelle in der folgenden Form:

Datum Ereignis
2011-06-28 ...
2011-06-30 ...
2011-07-05 ...
2011-07-08 ...
2011-08-11 ...
2011-09-14 ...
2011-09-15 ...
2011-09-16 ...
2011-09-17 ...

Aus dieser Tabelle sollten 5 Einträge zurück gegeben werden, die durch ein Datum und bestimmt werden, dazu die 4 älteren Einträge. Die Ausgabe sollte aber aufsteigend sortiert sein.

Kein Problem mit SQL:

Zur Verfügung stehen in SQL (u.v.a.) die Befehle SELECT, SORT, LIMIT, ORDER (DESC). Die genügen auch.

SELECT `datum`, `ereignis`
     FROM `tabelle`
     WHERE `datum` <= '2011-09-15'
     ORDER BY `datum` DESC
     LIMIT 0,5

lieferte fast das vom Kunde des Hilfesuchenden gewünschte Ergebnis. Nämlich die 5 gesuchten Einträge, nur falsch sortiert. Dort war bei dem Hilfesuchenden, Mitarbeiter einer großen Agentur, das Ende der Fahnenstange erreicht, die Sortierung war ihm nicht möglich und in den PHP-Skripten, welche das Content-Management-System des Kunden der Werbeagentur bildeten durfte oder wollte er nicht herumschreiben. Warum auch immer, er hat das nicht weiter begründet.

Programmierer oder genauer: Programmentwickler müssen abstrahieren können. Einfach Wissen genügt nicht, man muss aus der Aufgabe und dem eigenen Wissen auch zu einer Lösung kommen und hier liegt der Fall eigentlich ganz einfach:

Lösung: Subselect

MySQL kann praktisch jedes Element einer Abfrage durch eine Unterabfrage bilden. So kann, das wird hier benötigt, eine Tabelle auch eine Rückgabe einer Abfrage sein, denn aus Sicht der Datenbank ist diese ja eigentlich nichts anderes.

SELECT `datum`, `ereignis`
     FROM (
          SELECT `datum`, `ereignis`
              FROM `tabelle`
              WHERE `datum` <= '2011-09-15'
              ORDER BY `datum` DESC
              LIMIT 0,5
          ) AS `temp`
     ORDER BY `datum`

Nach dem der Lösungsstand des Hilfesuchenden schon das gewünschte Ergebnis, aber mit der falschen Sortierung, lieferte ist es fast logisch, einfach mit einem Subselect die Ergebnismenge zu ermitteln und dann so zu sortieren wie die Ausgabe gewünscht ist. Das war es schon.

Das viel größere Problem für einen Selbständigen

Was berechne ich wohl für die Lösung? Einerseits hatte ich zwar nur wenig Aufwand, andererseits brauchte die Werbeagentur mich, weil diese sich keinen "greyhead" leisten wollte. Ich denke, es war richtig und fair den Satz für eine Stunde abzurechnen.


Weitere Informationen in diesem Bereich: