Mysql 4.2 -> Group By & Multiple Joins zur Reportgenerierung

Mik3e

Erfahrenes Mitglied
Hi zusammen,

Ich hänge (mal wieder) bei einem etwas komplexeren SQL Query.
Um die Sache besser zu erläutern habe ich ein ERD gebaut anhand des typischen Beispiels "Bestellung / Buchung".

Aufbau und Datenquelle:
Das ERD zeigt den Aufbau einer Buchung. Diese besteht aus der eigentlichen Buchung (tbl_buchung), keiner, einer oder mehrerer Buchungsgebühren (tbl_buchung_buchungsgebuehr), keinem, einem oder mehreren Produkten (tbl_buchung_produkte) sowie keinen, einer oder meherer Versandspesen (tbl_buchung_versandspesen). Die genauen Beziehungen seht ihr schön übersichtlich am ERD im Anhang.

Wichtiger Tipp am Rande: Primärschlüssel beginnen mit "pk_", Fremdschlüssel mit "fk_".

Problemstellung / gesuchte Lösung:
Es soll nun ein Report Query generiert werden, der mir folgende Ausgabe liefert (Grundlage für die Zahlen sind die Beispieldaten im ERD):
Code:
pk_buchung_id | buchung_datum | summe_buchungsgebuehr | summe_produkte_betrag | summe_versandspesen
1             | 18.09.2005    | 16.00                 | 379.00                | 4.50
2             | 19.09.2005    | 7.00                  | 38.00                 | NULL
In Worten:
Suche mir die aggregierten Summen von Buchungsgebühren, Produkten und Versandspesen, gruppiert nach buchungs_id.Sollten keine Datensätze gefunden werden, liefere NULL.

Mein (falscher) Lösungsansatz:
Ich habe bereits einen Query, der mir fleissig Daten liefert. Allerdings hat er beim aggregieren der Daten anscheinend echte Problem (die Summen stimmen nie):

Code:
SELECT 
t1.pk_buchung_id,
t1.buchung_datum,
SUM(t2.buchung_buchungsgebuehr_betrag) AS summe_buchungsgebuehr,
SUM(t3.buchung_produkte_betrag) AS summe_produkte_betrag,
SUM(t4.buchung_versandspesen_betrag) AS summe_versandspesen
FROM 
tbl_buchung AS t1
LEFT JOIN tbl_buchung_buchungsgebuehr AS t2 ON t1.pk_buchung_id=t2.fk_buchung_id
LEFT JOIN tbl_buchung_produkte AS t3 ON t1.pk_buchung_id=t3.fk_buchung_id
LEFT JOIN tbl_buchung_versandspesen AS t4 ON t1.pk_buchung_id=t4.fk_buchung_id
WHERE
1>0
GROUP BY t1.pk_buchung_id
Bemerkung am Rande:
Sollten hier kleine Syntax-oder Tippfehler enthalten sein, seht es mir bitte nach. Habe das Beispiel nur zur Veranschaulichung meines eigentlichen Problems aus dem Handgelenk geschüttelt :) Mir geht es wirklich nur um die Logik des Queries...

Ich hoffe der Aufwand dieses Beispiel zu erstellen hat sich gelohnt (wovon ich ausgehe :).
Danke für jeden konstruktiven Vorschlag vorweg,
LG & Ciao,
Mike
 

Anhänge

  • exampleerd.jpg
    exampleerd.jpg
    81,8 KB · Aufrufe: 35
Der Fehler entsteht durch die mehrfachen JOINs.
Der Join ist ja bekanntermaßen das Kreuzprodukt zweier Tabellen.
Mit dem ersten bildest Du das Kreuzprodukt aus zwei Tabellen.
Damit hast Du mehr Zeilen als Buchungen. Dieses Erbebnis wird mit der nächsten Tabelle gekreuzt. Damit hast Du zu jedem Datensatz einer Buchung mit entsprechendem Eintrag aus der zweiten Tabelle die in Tabelle drei vorhanden Datensätze, womit die Daten nach der Gruppierung natürlich mehrfach vorkommen.

Als Lösung sehe ich im Moment nur Subselects in der Projektion.

Nur ein Ansatz:
Code:
SELECT 
t1.pk_buchung_id,
t1.buchung_datum,
(SELECT 
  SUM(t2.buchung_buchungsgebuehr_betrag)
  FROM tbl_buchung_buchungsgebuehr AS t2
  WHERE t1.pk_buchung_id=t2.fk_buchung_id
) AS summe_buchungsgebuehr
FROM tbl_buchung AS t1
Das überflüssige WHERE solltest Du übrigends entfernen.

Gruß hpvw
 
Ok.. vergiss es.. bleibt mir wohl nichts anders über, als den Query aufzuteilen. Performance-Kill hoch 3, aber es gibt anscheinend wirklich keine andere Alternative..

Ciao,
Mike
 
Zurück