Mit gejointer Tabelle ordnen
sacool
- datenbank
Hallo,
ich bin gerade dabei ein flat(?)-Forum in PHP zu schreiben. Also eines wioe das WB-Board oder das Burning Board.
Dabei hänge ich gerade bei einer MySQL Abfrage.
Das Forum hat zwei Tabellen: Topic und Post
In Topic stehen die einzelnen Themen un in Post die Beitröäge zu den Themen. Die Tabellen sind wie folgt aufgebaut:
ID
Date
Title
ID
TopicID
Date
Title
UserID
Content
Nun zu meinem Problem. Ich nöchte die Beiträge, wie das in solchen Foren üblich ist, so sortieren, dass das Thema mit dem neusten Beitrag oben steht.
Hört sich einfach an. Leider habe ich damit meine Schwierigkeiten.
Ich habe die Tabelle Post nun mit JOIN ON mit Topic verbunden, weiß aber nicht wie ich nun als ORDER BY Wert das Datum des letzen mit dem jeweiligen Topic verbunden Posts bekomme.
Meine bisherige Abfrage (ohne Sortierung):
SELECT t.ID,
t.Title,
FROM
topic t
JOIN
post p
ON
p.TopicID = t.ID
Ich hoffe man versteht was ich meine.
Topic
ID
Date
TitlePost
ID
TopicID
Date
Title
UserID
Content
Gibts auch eine dritte Tabelle "User"?
Meine bisherige Abfrage (ohne Sortierung):
SELECT t.ID,
t.Title,
FROM
topic t
JOIN
post p
ON
p.TopicID = t.ID
ORDER BY Topic.Date DESC
Gibts auch eine dritte Tabelle "User"?
Ja, es gibt auch noch einige andere Tabellen, die aber in diesem Fall eine nicht allzu große Rolle spielen. Habe nur vergessen den Eintrag zu löschen.
ORDER BY Topic.Date DESC
In Topic.Date soll stehen, wann das Thema gestartet wurde. Also egal, wie neu die Beiträge innerhalb des Themas sind, das Datum in Topic bleibt gleich.
Beispiel:
Ein Thema ist schon zwei Jahre alt und in den zwei Jahren sind hunderte von neuen Themen in die Tabelle Topic aufgenommen worden. Wenn ich nun ORDER BY Topic.Date DESC benutzen würde, würde das zwei Jahre alte Thema ganz weit unten angezeigt werden.
Nun gibt ein User nach diesen zwei Jahren aber ein Antwort auf das Thema. Durch diesen ganz neuen Beitrag in der Tabelle Post soll auch das Topic wieder ganz oben erscheinen, sodass andere User auch mitbekommen, dass es einen neuen Beitrag gibt.
Wo ist das Problem genau? Du holst Dir alle Einträge und sortierst eben nicht nach topic sondern nach Eintrag.
Wo ist das Problem genau? Du holst Dir alle Einträge und sortierst eben nicht nach topic sondern nach Eintrag.
wie meinst du das?
Wo ist das Problem genau? Du holst Dir alle Einträge und sortierst eben nicht nach topic sondern nach Eintrag.
wie meinst du das?
Du packst in die SELECT-Liste alle Datenfelder, die Du benötigst und sortierst absteigend per SORT-Klausel nach post.date (oder wie Du das DF genannt hast).
Du packst in die SELECT-Liste alle Datenfelder, die Du benötigst und sortierst absteigend per SORT-Klausel nach post.date (oder wie Du das DF genannt hast).
Die Methode hat bei mir auch nicht wirklich funktionier.
Habe es jetzt aber doch noch hinbekommen und zwar so (falls jemand noch mal das Problem haben sollte):
SELECT t.ID,
t.Title,
t.Views
FROM
topic t
ORDER BY
(SELECT
Datum
FROM
post p
WHERE
t.ID = p.TopicID
ORDER BY
p.Datum DESC
LIMIT
1) DESC
SELECT t.ID,
t.Title,
t.Views
FROM
topic t
ORDER BY
(SELECT
Datum
FROM
post p
WHERE
t.ID = p.TopicID
ORDER BY
p.Datum DESC
LIMIT
1) DESC
Dass das funzt. ;)
Wenn Du allerdings nicht die Daten zum letzten Eintrag ("post") benötigst, ist natürlich die Gruppierung, wie von globe angeregt, die richtige Wahl.
n'abend,
Nun zu meinem Problem. Ich nöchte die Beiträge, wie das in solchen Foren üblich ist, so sortieren, dass das Thema mit dem neusten Beitrag oben steht.
du meinst: Du möchtest eine Liste aller Topics deines Boards sortiert nach Datum des jeweils letzten Posts eines Topics?
Du möchtest dir die Aggregatsfunktionen in MySQL genauer anschauen.
GROUP BY, MAX(), MIN(), COUNT() ;)
weiterhin schönen abend...