# [MySQL] zwei LEFT JOIN



## sasuki (8. Mai 2004)

Hallo,

Ich hab ein Problem mit LEFT JOIN,
und zwar wenn ich 2 LEFT JOINs benutze, kommen falsche werte raus.

meine MYSQL-Abfrage sieht so aus:

```
SELECT a.*, DATE_FORMAT(a.date, '%d.%m.%y %H:%i') as 'fdate', COUNT(b.id) as 'comments', COUNT(c.id) as 'updates'
FROM news a LEFT JOIN comments b ON b.newsid = a.id LEFT JOIN news_updates c ON c.newsid = a.id
GROUP BY a.id ORDER BY a.id DESC LIMIT 0, 16
```

Zuerst werden alle daten der news abgefragt, mit formatierten datum-zeit,
dann die comments und die updates pro news.

wenn ich die updates wegmache funktioniert es einwandfrei, und es kommt ein rchtiger comments wert raus, umgekehrt auch.

wenn ich beide lasse, kommt bei beiden das produkt von beiden, also beide werden multipliziert.

Wie kann ich das problem lösen?

danke

sasuki


----------



## JohannesR (8. Mai 2004)

Ich hab das ganze mal ins Datenbanken-Forum verschoben, da gehört es nämlich hin...


----------



## vop (10. Mai 2004)

Hier wird für jeden Eintrag aus Tabelle b der Eintrag aus Tabelle c einmal ermittelt. Daher erhältst du das Produkt.

Du müßtest wohl beim zweiten Join eine weitere Bedingung hinzufügen
Versuch mal
SELECT a.*, DATE_FORMAT(a.date, '%d.%m.%y %H:%i') as 'fdate', COUNT(b.id) as 'comments', COUNT(c.id) as 'updates'
FROM news a LEFT JOIN comments b ON b.newsid = a.id LEFT JOIN news_updates c ON c.newsid = a.id AND b.newsid = c.newsid
GROUP BY a.id ORDER BY a.id DESC LIMIT 0, 16 

vop


----------



## sasuki (10. Mai 2004)

gleiches resultat....

sasuki


----------



## ManicMarble (10. Mai 2004)

Hallo,
Ich nehme an, Du hat eine News-Tabelle und zu jedem News-Satz gibt es mehrere Comments und mehrere Updates. Jetzt willst Du einen SELECT, der zu jeder News die Anzahl an Comments und Updates ausgibt. Wie vop schon geschrieben hat, erhältst Du mit den 2 JOINs _jeden_ Comments-Satz zu jeder News und zu _jeder_ dieser Kombinationen _jeden_ Updates-Satz, daher das Produkt. Wenn Du mal das GROUP BY weglässt, dann siehst Du, was genau mit COUNT gezählt wird.

Mein Vorschlag: Verwende COUNT DISTINCT, damit sollte jede Id nur einmal gezählt werden:

```
SELECT
 a.*,
 DATE_FORMAT(a.date, '%d.%m.%y %H:%i') as 'fdate',
 COUNT(DISTINCT  b.id) as 'comments',
 COUNT(DISTINCT c.id) as 'updates'

FROM
 news a
LEFT JOIN
 comments b ON b.newsid = a.id
LEFT JOIN
 news_updates c ON c.newsid = a.id

GROUP BY
 a.id

ORDER BY
 a.id DESC

LIMIT 0, 16
```
Leider kann ich's nicht ausprobieren, weil ich auf meinem Heim-PC keinen MySQL-Server habe. Ich glaube aber, das müsste gehen.
Grüße,
Martin


----------



## sasuki (10. Mai 2004)

jo funktioniert,
vielen dank

sasuki


----------

