2 LEFT JOIN's in einer Abfrage

B

ByeBye 251003

Hallo, ich bitte um Hilfe. Ich versuche 2 LEFT JOIN's zu verarbeiten, erhalte aber falsche Ergebnisse. Wie muss ich's richtig machen? Tausend Dank !!

Code:
tbl_EG
ID_EG   |EG_FELD1   
------------------
1       |EG1    
2       |EG2    
3       |EG3

tbl_Jot
ID_Jot  |ID_EG  |Jot_FELD1   
------------------------------
1       |2      |Jot1    
2       |3      |Jot2 
3       |2      |Jot3
4       |1      |Jot4
5       |1      |Jot5 

SELECT COUNT(tbl_Jot.ID_Jot) AS MENGE1,
tbl_EG.ID_EG,
FROM tbl_EG
LEFT JOIN tbl_Jot ON tbl_Jot.ID_EG = tbl_EG.ID_EG
GROUP BY tbl_EG.EG_FELD1

Ergebnis (funktioniert korrekt):
MENGE1  |ID_EG   
---------------
2       |1    
2       |2    
1       |3

bis hier läuft es korrekt. Wenn ich aber u.g. probiere, also aus einer weiteren Tabelle abfrage, stimmt das Ergebnis nicht ...

Code:
tbl_Anz
ID_Anz  |ID_EG  |Anz_FELD1   
------------------------------
1       |1      |Anz1    
2       |1      |Anz2 
3       |3      |Anz3
4       |2      |Anz4
5       |1      |Anz5 

SELECT COUNT(tbl_Jot.ID_Jot) AS MENGE1,
COUNT(tbl_Anz.ID_Anz) AS MENGE2,
tbl_EG.ID_EG,
FROM tbl_EG
LEFT JOIN tbl_Jot ON tbl_Jot.ID_EG = tbl_EG.ID_EG
LEFT JOIN tbl_Anz ON tbl_Anz.ID_EG = tbl_EG.ID_EG
GROUP BY tbl_EG.EG_NICK

Ergebnis (also so soll es sein):
MENGE1  |MENGE2  |ID_EG   
-----------------------
2       |3       |1
2       |1       |2
1       |2       |3
 
Annahme: Da du das Problem im PHP-Forum gepostet hast, geh ich davon aus, dass du mit MySQL arbeitest

So auf die Schnelle
Du kannst nicht nach A Gruppieren und B ausgeben. Wenn du die ID_EG ausgibst, muss auch der GROUP BY nach ID_EG sein. MySQL ist da manchmal zu gütig und akzeptiert ungültige Groups

Das Problem ist, dass sich die Datenmenge aufwiegelt.
In der tbl_eg hast du einen Datensatz mit der id_eg=1
Wenn du die tbl_jot anhängst, hast du 2 Einträge mit der id_eg=1. Und zwar ist das
[Anzahl aus tbl_eg mit id_eg=1]*[Anzahl aus tbl_jet mit id_eg=1]
Ergo 1*2=2

Nun hängst du noch die Tabelle tbl_anz an. Diese hat 3 Einträge. Damit multipliziert sich die Menge:
[Anzahl aus tbl_eg mit id_eg=1]*[Anzahl aus tbl_jet mit id_eg=1]*[Anzahl aus tbl_anz mit id_eg=1]
Ergo 1*2*3=6

Du musst die Zählung in den Kind-Tabellen durchführen und dann erst alles zusammenziehen. Alle Quellen müssen die gleiche Aggregation haben.
SQL:
SELECT 
	jot.cnt_jot,
	anz.cnt_anz,
	tbl_EG.ID_EG
FROM 
	tbl_EG
	LEFT JOIN (
			SELECT 	id_eg, COUNT(id_jot) AS cnt_jot
			FROM		tbl_Jot 
			GROUP BY	id_eg
		) AS jot
		ON jot.ID_EG = tbl_EG.ID_EG
	LEFT JOIN (
			SELECT 	id_eg, COUNT(id_anz) AS cnt_anz
			FROM		tbl_Anz
			GROUP BY	id_eg
		) AS anz	
		ON anz.ID_EG = tbl_EG.ID_EG


Anbei, da es sich um ein reines SQL-Problem handelt, verschiebe ich es mal in den Datenbank-Bereich
 
Zuletzt bearbeitet von einem Moderator:
Erstmal sehr vielen Dank !

>> Annahme: Da du das Problem im PHP-Forum gepostet hast, geh ich davon aus, dass du mit MySQL arbeitest
Ja.

>> muss auch der GROUP BY nach ID_EG sein
Hatte ich falsch angegeben.

>> Das Problem ist, dass sich die Datenmenge aufwiegelt.
Das stimmt, bzw. konnte ich beobachten, irgendwas "potenzierte" (vermehrfachte) sich ... :D Sehr plausible Erklärung von Dir ...

>> Du musst die Zählung in den Kind-Tabellen durchführen und dann erst alles zusammenziehen
Einleuchtend ...

>> Anbei, da es sich um ein reines SQL-Problem handelt, verschiebe ich es mal in den Datenbank-Bereich
Hatte ich im Eifer des Gefechtes übersehen ... Sorry.



Der Einsatz klappte sofort.

Die Abfrage liefert wie gewollt, nur mir erschließt sich nicht genau, warum ein Ergebnis von 0 Nichts ergibt?

Aber ich muss mir das ganze nochmal genau auf der Zunge zergehen lassen ...

Nochmal sehr vielen Dank !! Echt supi !
 

Neue Beiträge

Zurück