SQL Abfrage mit JOIN/Grouping Problem

Kantholy

Lt. Junior Grade
Registriert
Aug. 2006
Beiträge
323
Hallo, ich fass mich dieses mal kurz:

ich will für meine Firma das Intranet mit vorhandener Struktur (Benutzerdatenbanken, etc.) um eine kleine Diskussionsplatform erweitern, also quasi sowas wie ein Mini-forum...

Ich bin grad am Datenbankdesign, meine Datenbank hab ich mal aus der Designeransicht vom PMA angehängt...

jetzt gehts an den Query für the "Threads" quasi:

ich will mir das Datum des letzten Posts auswerfen lassen, ohne den "last_post" in den topics mit abspeichern zu müssen (von wegen 3. NF)

mein Query sieht bis jetz wie folgt aus:

Code:
SELECT
	t.id, t.name, t.type, t.state,
	u.username, u.firstname, u.lastname,
	p.`post_time`
FROM `topics` as t
LEFT JOIN `users` as `u` ON t.author = u.uid
LEFT JOIN `posts` as `p` ON p.topic_id = t.id

atm würde das alle POSTS aus allen Threads ausspucken, das ist natürlich etwas zu viel des guten... deswegen füge ich an den oberen Query unten einfach
Code:
GROUP BY t.id
an, Resultat: es wird mir für jeden Thread(Topic) nur ein Resultat geliefert, allerdings mit der ersten in der Datenbank gefundenen "post_time"...

bekomm ich davor noch meinen `posts` join irgendwie nach `id` DESC sortiert - oder gibts da anderweitig ne Lösung?!

Ich möchte allerdings ungerne umständliche Subqueries benutzen - und das ganze muss natürlich verdammt performant sein, also auch nicht ewig brauchen um mir das Resultat zu liefern, alternativ verzichte ich auf die 3.NF und führe in der "topic" tabelle das "last_post" property mit...

thx in advance
 

Anhänge

  • db.png
    db.png
    23,3 KB · Aufrufe: 196
Hm, warum sollte das nicht gehen? GROUP BY ... HAVING ... ORDER BY ... - das ist ansich die Syntax. Bekommst du einen Fehler zurückgeliefert, wenn du das so abfragst?

EDIT: Ansonsten brauchst du doch eine innere Abfrage / Subquery, dann mit MAX() auf post_time und GROUP auf t.id.
 
Zuletzt bearbeitet:
Hab gerade nicht zum testen zur Hand aber
geht max() nicht auch ohne Subquery?
Also quasi:

SELECT
t.id, t.name, t.type, t.state,
u.username, u.firstname, u.lastname,
max(p.post_time)
FROM `topics` as t
LEFT JOIN `users` as `u` ON t.author = u.uid
LEFT JOIN `posts` as `p` ON p.topic_id = t.id
GROUP BY t.id
 
Zurück
Oben