Tabelle anhand Wert in anderer Tabelle sortieren (JOIN)

kamp

Grünschnabel
Hallo!

Ich programmiere mir gerade zu Übungszwecken ein kleines Forum. Nun stehe ich allerdings gerade vor einem kleinen Problem. Ich habe eine Tabelle (threads) wo alle Threads drin sind, und eine Tabelle (answers) wo alle Antworten drin sind.

Die Tabellen haben folgende Struktur:

threads
id | fid | titel | datum
-------------------
1 | 1 |test |2011-06-06 02:37:14
2 | 1 |bla |2011-06-06 03:30:12
...usw

answers (tid ist gleich die id in threads)
id | tid | fid | titel | text | datum
-------------------------------
1 | 1 | 1 |test | abc | 2011-06-06 02:37:14
2 | 2 | 1 |bla | xyz | 2011-06-06 03:30:12
3 | 1 | 1 | | ghj | 2011-06-06 03:34:11
...usw

Wie ihr ja alle wisst, wird der aktuellste Thread in einem Forum ja immer oben angezeigt, also sortiert von neu nach alt. Das ist ja kein Problem, würde so aussehen:

PHP:
mysql_query("select * from threads where fid='".$_GET['fid']."' order by erstellt desc");

Wenn jetzt nun in einem alten Beitrag eine Antwort käme (wie in der obigen Tabellenstruktur), bleibt das aktuellere Thema mit dem Code trotzdem an 2. Stelle. Es wird ja nach dem Erstelldatum des Threads, nicht nach dem Erstelldatum der neuesten Antwort in einem Thread sortiert. Das kann man ja mit JOIN lösen, allerdings habe ich da noch nicht wirklich den Durchblick wie das funktionieren soll. Ich bin derzeit bei folgendem Code:

PHP:
mysql_query("select * from threads t1 join answers t2 on (t1.erstellt=t2.erstellt) where fid='".$_GET['fid']."' order by t2.erstellt desc");

Nun, das funktioniert schon mal nicht...

Ich hoffe es ist klar, was ich möchte? Wie sollte die MySQL Abfrage richtig lauten?
 
Mit einer Unterabfrage pro Thread das neuste Antwortdatum auslesen. Und falls keine Antwort vorhanden ist, dass Thread-Datum nehmen
SQL:
SELECT
	threads.*,
	IFNULL(last_answer.max_datum, threads.datum) AS datum
FROM
	threads
	LEFT JOIN (
			SELECT
				tid,
				fid,
				MAX(datum) AS max_datum
			FROM
				answers
			GROUP BY
				tid,
				fid
		) AS last_answer
		ON threads tid = last_answer.tid
WHERE
	fid = {$_GET['fid']}
ORDER BY
	IFNULL(last_answer.max_datum, threads.datum) DESC;

Achja, du vergleichst im WHERE in deinem Beispiel die fid als String. Ich hoffe doch sehr, dass dies eine Zahl ist
 
Zuletzt bearbeitet von einem Moderator:
Danke schonmal für deine Hilfe. Jedoch durchblicke ich das nicht ganz, funktionieren tuts auch nicht, selbst mit korrigierter Syntax. Du verwendest da auch immer wieder die fid, warum? Die fid bezieht sich nicht auf die beiden Tabellen. Und wo ist die Verbindung von der id der threads tabelle zu der tid der answers? Naja, ich hab versucht die Abfrage an meine Struktur anzupassen, aber hab es nicht geschafft. Vielleicht hilfts wenn ich dir die SQL anhänge?
 

Anhänge

War nur ein Fehler drin. im ON-Teil hatte ich ein Leerschlag anstelle eines Punktes.
Hab das ganze deinen Namensgebungen angepasst (die nicht mit den Tabellenbeschreibungen aus deinem Anfangsposting übereinstimmen).
Zufem habe ich es gleich noch erweitert, dass du auch die Anzahl Beiträge pro Thread siehst
SQL:
SELECT
    threads.*,
    IFNULL(last_answer.max_datum, threads.erstellt) AS bearbeitet_am,
    last_answer.anzahl_beitraege
FROM
    f_threads AS threads
    LEFT JOIN (
            SELECT
                tid,
                COUNT(*) AS anzahl_beitraege,
                MAX(erstellt) AS max_datum
            FROM
                f_answers
            GROUP BY
                tid,
                fid
        ) AS last_answer
        ON threads.id = last_answer.tid
WHERE
-- Fier die Forenid aus $_GET Filtern (analog deinem Beispiel)
    fid = 2
ORDER BY
    IFNULL(last_answer.max_datum, threads.erstellt) DESC;
 
Zuletzt bearbeitet von einem Moderator:
War nur ein Fehler drin. im ON-Teil
den meinte ich auch :)
...selbst mit korrigierter Syntax...

Ok, ich sehe beim Anpassen (zumindest bein Versuch) an meine Tabellen hab ich da groben Mist gebaut. Dein Code funktioniert 1A! Ich werde damit noch ein bisschen herum probieren, einiges verstehe ich noch nicht wirklich.

Danke dir!

PS: Hab gerade den Beitragszähler bemerkt, das ist super! Dafür hab ich bisher eine weitere Abfrage gehabt, die ich nun dem Server erspare ;)
 
Zuletzt bearbeitet:
Zurück