Philipp Hasenfratz: Komplizierte MySQL-Abfrage!?

Beitrag lesen

Halihallo Julia

name | flut | erdbeben | gesamt

berta|  15  |     25   |   40
anton|  10  |      5   |   15
cäsar|   5  |      5   |   10
Die Sortierung erfolgt also nach der Gesamtspendensumme des Spenders.

Lässt sich das durch eine MySQL-Abfrage abbilden? Wenn ja, hat jemand ein paar Ansätze die mir weiterhelfen könnten. Ich weiß ehrlich gesagt nicht wie ich das anfangen soll.

Generell und allgemein gesagt Nein. MySQL bzw. SQL unterstützt kein
Abbilden von Attributwerten in Attributnamen (flug und erdbeben sind
ja Attributwerte und sollen in der Ausgabe *plötzlich* zu
Attributnamen verwandelt werden, das ist böse Magie!).

Speziell aber ja. Speziell genau dann, wenn du eine fixe Anzahl an
Katastrophen hast (im Beispiel 2) bzw. eine Technik wie PHP was dir
ja zur Verfügung steht, mit Hilfe dieser du die Anfrage dynamisch
zusammenstellen kannst.

Dann geht's sinngemäss über korrelierte Subqueries so:

SELECT
   a.name,
   (
      SELECT SUM(spende) FROM table WHERE name=a.name
         WHERE aktion='flut'
   ) AS 'flut',
   (
      SELECT SUM(spende) FROM table WHERE name=a.name
         WHERE aktion='erdbeben'
   ) AS 'erdbeben',
   (
      SELECT SUM(spende) FROM table WHERE name=a.name
   ) AS 'gesamt'
FROM table AS a
GROUP BY a.name
ORDER BY gesamt

Nun, jeder Datenbankexperte würde dich für dieses Konstrukt zwar
umbringen und die meisten Datenbanken quittieren dir den Dienst mit
einer Fehlermeldung, aber ich könnte mir doch vorstellen, dass MySQL
da mitmacht.

Oftmals werden Subqueries in der SELECT-Klausel ganz verweigert.
Andere Datenbanken (z.B. DB2) lassen einwertige und einattributige
Subqueries in SELECT zu.

Zudem sind diese korrelierten Subqueries, wenn es eine schnellere
Lösung gibt, zu unterlassen (was für eine Erkenntnis :-)).

Eine andere, aber ebenso stupide Lösung wäre über drei Joins zu
gehen. Ggf. mit der Prämisse, dass jeder mindestens einmal für jede
Katastrophe spendet, dann gehts sogar ohne grössere Tricks
(unbestätigt aber etwas bedacht in den Raum geworfen).

Nun, zusammenfassend: Über eine SQL-Anfrage würde ich dies kaum
machen, besonders nicht weil du PHP als Vorhanden zeichnest. Überlege
dir, wie du mit PHP und zwei SQL-Anfragen an dein Ziel kommst.

Viele Grüsse

Philipp