2009-08-16 18 views
0

Grundsätzlich schreibe ich ein kleines Forum-Skript für ein Intranet.Forum, erhalten letzten Beitrag/Thema

Ich habe 3 mysql (MySQLi) Tabellen für das Forum bekam:

forum_answer - hält Antworten forum_question - erste Beiträge forum_categories hält - hält Namen und Beschreibung der Kategorien.

Ok, so auf dem Forum Index, ich habe eine Tabelle, um alle Kategorien zu holen, aber ich habe auch eine Spalte, um den letzten Beitrag in dieser Kategorie/Forum gemacht zu holen.

Hast du irgendwelche Ideen, wie ich den letzten Beitrag in diesem Forum machen könnte?

Ich dachte daran, vielleicht eine neue Spalte in der Tabelle forum_categories hinzuzufügen und sie jedes Mal zu aktualisieren, wenn ein Beitrag erstellt wird, aber das könnte unordentlich werden.

Danke :)

+0

Sie haben kein Datumsfeld für jeden Beitrag? –

+0

tue ich, aber wie würde ich es sowohl für die Antwort als auch den ersten Beitrag bestellen? – bear

Antwort

2

Abfrage-weise, können Sie es mit Ihrer Anfrage erhalten die Liste der Kategorien, um etwas mit ähnlich ist:

select forum_categories.id, forum_categories.name, max(forum_answer.id) as 
from forum_categories 
left join forum_questions on forum_questins.category_id = forum_categories.category_id 
left join forum_answers on forum_answers.question_id = forum_questions.question_id 
group by forum_categories.id, forum_categories.name 

Wie teuer eine Operation hängt es von der Art Ihrer Foren ist. Das Aktualisieren einer Spalte in der Kategorie jedes Mal, wenn jemand Beiträge posten kann, ist teurer, wenn Personen häufig posten. Wenn Benutzer die Liste der Kategorien häufig laden, sind die Joins möglicherweise die teurere Operation.

Vielleicht haben Sie auch finden es vorteilhaft, eine Ansicht erstellen Sie Ihre Kategorieliste ziehen aus:

create view category_list as 
select forum_categories.id, forum_categories.name, max(forum_answer.id) as latest_asnwer_id 
from forum_categories 
left join forum_questions on forum_questins.category_id = forum_categories.category_id 
left join forum_answers on forum_answers.question_id = forum_questions.question_id 
group by forum_categories.id, forum_categories.name 

die Sie dann als zugreifen konnte, obwohl es sich um eine Tabelle waren.

+0

Interessant, als ich versuchte, die Ansicht zu erstellen, tat es nur für eine Kategorie. – bear

+0

Ah, mit max (forum_answer.id) greift nur die letzte Antwort auf, was wir nicht brauchen. – bear

+0

Ah, ich habe die Gruppenklausel vernachlässigt. Sie müssen nach allen von Ihnen eingeschlossenen forum_categories-Spalten gruppieren. Ich habe meine Antwort aktualisiert, um illustrativ zu sein. –

1

Sie denken tatsächlich in die richtige Richtung.

Sie sollten den letzten Beitrag für eine Frage und den letzten Beitrag für ein Forum definitiv "zwischenspeichern" und in Ihren [forum_question] - und [forum_categories] -Tabellen speichern. "Cache" bedeutet, sie jedes Mal zu aktualisieren, wenn jemand einen neuen Beitrag hinzufügt oder einen Beitrag löscht.

Wenn Ihr Forum-Inhalt einen Schwellenwert erreicht, werden die Live-Berechnungen der letzten Posts furchtbar langsam sein. Indem Sie den "Cache" jedes Mal aktualisieren, wenn ein neuer Beitrag eingereicht wird, teilen Sie diese riesige einmalige Berechnungsarbeit in kleine Aktualisierungen auf, die auf viele Anfragen verteilt und daher fast nicht wahrnehmbar sind.

Der einzige Treffer, den Sie erhalten, wenn Sie einen Beitrag löschen, dann müssen Sie den Cache für die Frage und das Forum aktualisieren. Aber dies ist ein seltenes Ereignis, so dass der Preis gewährt werden kann.

+0

ok, ich habe Probleme damit:/ – bear