2010-07-03 5 views
5

Ich habe diese drei TabellenMySQL Query Design for Letzter Beitrag pro Forum

forums_forum

+-----+--------+-------------+-------+-----+ 
| fid | name | description | index | cid | 
+-----+--------+-------------+-------+-----+ 
| 36 | gdghdf | hjghj  | 54 | 5 | 
| 45 | yutuy | iuyi  | 99 | 6 | 
+-----+--------+-------------+-------+-----+ 

forums_threads

+----+-----+-----+-------+-------+------+-----------+------+ 
| id | tid | fid | moved | mfrom | view | important | lock | 
+----+-----+-----+-------+-------+------+-----------+------+ 
| 1 | 4 | 36 |  0 | NULL | 0 |   0 | 0 | 
| 2 | 12 | 36 |  0 | NULL | 7 |   0 | 0 | 
| 3 | 9 | 15 |  0 | NULL | 0 |   0 | 0 | 
+----+-----+-----+-------+-------+------+-----------+------+ 

forums_posts

+----+-------+--------+--------+---------------------+--------+--------+-----+ 
| id | title | detail | author | date    | edited | editby | tid | 
+----+-------+--------+--------+---------------------+--------+--------+-----+ 
| 1 | asfsd | sdfsd |  1 | 2010-07-01 21:31:29 |  0 | NULL | 4 | 
+----+-------+--------+--------+---------------------+--------+--------+-----+ 

Ich versuche zu schaffen Frage welche re turn result -> für jede eindeutige 'fid', eine Zeile von 'forums_posts' (ORDER BY 'date').

forums_forum. fid = forums_threads. fid forums_threads. tid = forums_posts. tid

Dank

+0

Was du meinst 'von forums_posts eine Zeile' tun. Irgendeine Reihe oder irgendeine bestimmte Reihe? –

+1

Ist es wichtig, welchen Beitrag Sie in jedem Forum auswählen? Oder kann es irgendein Thread und irgendein Datum sein? – mdma

+0

Die Idee ist: Ich habe einige Foren und ich möchte den neuesten Beitrag für dieses Forum bekommen. Aber Beiträge sind in Themen, die in Foren sind. – Blood

Antwort

3

Dies ist das ehrwürdige größte n-pro-Gruppe-Problem, das häufig bei Stack Overflow auftritt. Hier ist eine Lösung gegeben, um Ihre Tabellen:

SELECT p.* FROM forums_posts p JOIN forums_threads t ON p.tid = t.tid 
WHERE NOT EXISTS (
    SELECT * FROM forums_posts p2 JOIN forums_threads t2 ON p2.tid = t2.tid 
    WHERE t.fid = t2.fid AND p.date < p2.date 
); 
+0

das funktioniert hervorragend! Vielen Dank!!! – Blood

1

Nun schlage ich für Sie einige beitritt.

SELECT C.date, C.title, A.name 
FROM forums_forum A 
    JOIN forums_threads B ON A.fid=B.fid 
    JOIN forums_posts C ON B.tid=C.tid 
ORDER BY C.date DESC LIMIT 1 

oder .. nicht getestet:

SELECT MAX(c.date), C.date, C.title, A.name 
FROM forums_forum A 
    JOIN forums_threads B ON A.fid=B.fid 
    JOIN forums_posts C ON B.tid=C.tid 
LIMIT 1 

;-)

P. S. Sie könnten Schwierigkeiten bekommen, indem Sie eine Spalte "date" sowie "index" und "view" benennen, besser andere Namen verwenden.

S.p.s. Gibt es Fids (ich nehme an, das ist dein Primärschlüssel und sollte eindeutig sein), die mehr als einmal vorkommen?

+0

* forums_forum, plus: Ich denke, das gewünschte Ergebnis sollte aus der Tabelle forums_posts kommen und du hast die Bestellung vergessen. –

+0

danke dave ... einen moment ;-) – helle

+0

ich habe diese anfrage ausprobiert aber er gibt mir eine menge ergebnis für einen 'tid' zurück. Ich will ein Ergebnis von Unique 'Tid' und um das letzte zu sein, sortiert nach 'Datum' – Blood

0

Alternative zu einem JOIN, eine Spalte zu Ihrer forums_forums Tabelle mit einem Namen wie last_updated hinzufügen kann. Führen Sie bei jedem Posting zu einem Thread einfach einen zusätzlichen UPDATE like aus.

UPDATE Foren SET last_updated = NOW()

Dann die Foren durch die Reihenfolge der Foren zu erhalten, Ihre SELECT viel einfacher, und performant wird.

SELECT * FROM forums_forum ORDER BY last_updated DESC