[MySQL] zwei LEFT JOIN

sasuki

Grünschnabel
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:
Code:
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
 
Zuletzt bearbeitet:
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
 
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:
Code:
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
 

Neue Beiträge

Zurück