Probleme mit Left Join in verbindung mit Group By

SonMiko

Erfahrenes Mitglied
Hallo Zusammen,

sind Euch irgendwelche Probleme bei der gemeinsamen Verwensung von Left Join und Group By bekannt?
Ich habe folgendes Problem: Meine Abfrage sieht in etwa so aus:
Code:
SELECT
updates.id,
updates.id_user,
updates.creationdate,
user.id AS userid,
user.name,
user.status,
user.portrait
FROM
updates
LEFT JOIN user ON updates.id_user = user.id
GROUP BY user.id
HAVING user.status = 1
ORDER BY updates.creationdate

Nachdem ich den Query ausführe erhalte ich dummerweise die falsche Sortierung!
Nicht aber wenn das Group By weggelassen wird.

Liebe Grüße,

MIke
 
GROUP BY sortiert auch. Und nach dem GROUP BY hast du die Source updates nicht mehr unter diesem Namen

SQL:
SELECT data.*
FROM (SELECT
		updates.id,
		updates.id_user,
		updates.creationdate,
		user.id AS userid,
		user.name,
		user.status,
		user.portrait
	FROM
		updates
	LEFT JOIN user ON updates.id_user = user.id
	GROUP BY user.id
	HAVING user.status = 1) AS data
ORDER BY data.creationdate
 
Zuletzt bearbeitet von einem Moderator:
Hallo und vielen Dank für die Antwort -
leider liefert diese Abfrage dasselbe Ergebnis zurück wie meine vorherige.
Wieder ist der falsche Datensatz oben (ich habe natürlich noch das DESC ergänzt.

Die Erklärung klang plausibel, aber leider bleibt das Problem bestehen!
Lasse ich Group By weg, wird korrekt sortiert.

P.S.: -> Dieses Problem ist durch die Stichworte "left join und group by falsche sortierung" bei Google auf Platz 1. zu finden
 
Du gruppierst nur um eindeutige Datensätz zu kriegen. Versuchs mal mit DISTINCT anstelle GROUP BY (und WHERE anstelle von HAVING)
SQL:
SELECT DISTINCT
	updates.id,
	updates.id_user,
	updates.creationdate,
	user.id AS userid,
	user.name,
	user.status,
	user.portrait
FROM
	updates
LEFT JOIN user ON updates.id_user = user.id
WHERE user.status = 1
ORDER BY updates.creationdate DESC
 
Zuletzt bearbeitet von einem Moderator:
Okay gut - jetzt ist das Resultat genau das was ich erhalte wenn ich das Group By weglasse.
Aber ich erhalte leider auch einzelne user mehrfach was ich eben durch das Group By verhindern wollte.

Ein update hat genau einen user, aber ein user kann mehrere updates haben. Jedes update ist eine Tupel.
Daher habe ich eben versucht je nach userid zu gruppieren - Ziel: Es sollte immer nur das letzte update des users
in chronologischer Reihenfolge ausgegeben werden. :confused::confused::confused::confused::confused:
 
Der GOUP BY sollte in dem Fall in die Quelle. Zudem kannst du dort mit MAX() bereits das aktuellste Datum per User evaluieren.

Ich geh mal davon aus, update.id ist eine fortlaufende Zahl. Dann hat sie im GROUP BY nix verloren, da sie ja pro Zeile unterscheidlich ist.

SQL:
SELECT DISTINCT
	u.id_user,
	u.creationdate,
	user.id AS userid,
	user.name,
	user.status,
	user.portrait
FROM
	(SELECT
		updates.id_user,
		MAX(updates.creationdate) AS creationdate,
	FROM updates
	GROUP BY updates.id_user) AS u	
LEFT JOIN user ON u.id_user = user.id
WHERE user.status = 1
ORDER BY u.creationdate DESC
 
Zuletzt bearbeitet von einem Moderator:
Puh - nun geht gar nichts mehr -
Code:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM updates GROUP BY updates.id_user) AS u LEFT JOIN user ON u.i' at line 12

Btw. Mit welchem Tag kann ich SQL Code hier im Forum ausgeben?
 
Zuletzt bearbeitet:
So - vielen Dank nochmal für die Hilfe, hat alles leider nicht soo geklappt wie es sollte,
daher habe ich dann letztenendes den SQL-Guru befragt und er hat mir diese Lösung vorgestellt:

SQL:
SELECT  
     `g`.*, 
     `u`.*, 
     `u`.`updated` AS `lastupdate` 
FROM  
     `user` AS `g` 
     LEFT JOIN `updates` AS `u` ON `u`.`id`=( SELECT `id` FROM `updates` WHERE `id_user` = `g`.`id` ORDER BY `updated` DESC LIMIT 0,1 ) 
ORDER BY  
     `lastupdate` DESC

Genial! Danke Daniel - und für alle Beiträge und erbrachte Mühe hier ebenfalls ein Dankeschön.
 
Zuletzt bearbeitet von einem Moderator:
Zurück