Forum / Neue Beiträge oder nicht?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Forum / Neue Beiträge oder nicht?

    Huhu :]

    Ich bin gerade am optimieren eines Forumscripts von bzw. der Funktion, dass die Symbole vor den Forentiteln anzeigen, ob neue Beiträge da sind oder nicht. Ich habe folgende Tabellen:

    Quellcode

    1. `threads`
    2. - `id`
    3. - `bid` (ID des übergeordneten Forums)
    4. - `title` (Titel des Threads)
    5. - `last_post` (Timestamp, wann der letzte Beitrag in diesem Thread geschrieben wurde)

    Quellcode

    1. `threads_last_read`
    2. - `id` (interne ID)
    3. - `tid` (Die ID des Threads; vgl. oben)
    4. - `uid` (Die ID des Users)
    5. - `date` (Timestamp, wann der User den Thread gelesen hat)

    Bei jedem mal Lesen eines Threads wird ein neuer Datensatz angelegt in der Tabelle `threads_last_read` mit dem Timestamp, uid und tid. Ich denke ihr versteht, was ich meine.

    Nun möchte ich eine einfach Abfrage machen, die die Threads zählt, die im entsprechenden Board entweder ein höheres `last_post` haben als das Lese-`date` (sprich neue Beiträge) bzw. die vom User noch gar nicht gelesen wurden - die Abfrage soll quasi die Anzahl der ungelesenen Threads anzeigen für das jeweilige Forum (vgl. `bid`).

    Ich wollte das ganze so lösen:

    Quellcode

    1. SELECT COUNT(`tr`.`id`) AS `rows`
    2. FROM `threads_last_read` AS `tr`
    3. RIGHT JOIN `threads` AS `t` ON `t`.`id` = `tr`.`tid`
    4. WHERE `tr`.`date` < `t`.`last_post` AND `t`.`id` = '1' AND `tr`.`uid` = '123'

    Irgendwie funktioniert das aber noch nicht so ganz :/
    Kann mir wer helfen, wär super! :]

    Danke!
  • ich würde die Anfrage wie folgt formulieren.
    Wie du siehst habe ich die userid in die join bedingung gepackt. Und indem ich das Datum auf NULL prüfe, frage ich ab ob der join überhaupt stattgefunden hat.
    Klammern sind außerdem wichtig und RIGHT JOINs benutzt doch keiner ;)

    Quellcode

    1. SELECT *
    2. FROM threads t
    3. LEFT JOIN threads_last_read tlr
    4. ON t.id = tlr.tid
    5. AND tlr.uid = 123
    6. WHERE t.id = 1
    7. AND (
    8. ISNULL(tlr.date) OR tlr.date < t.last_post
    9. )
  • Habe mal die Version von d0nut probiert, die soweit funktioniert, aber es tritt genau das Problem auf, dass Hafner beschreibt - es werden alle alten Sachen ausgegraben und der Thread mehrmals gewertet.
    Ich denke das Problem liegt darin, dass eben für die Thread bei jedem mal anklicken ein Datensatz gespeichert wird. Wenn ich die jetzt immer bei Threadaufruf löschen lasse (die alten) und einen neuen anlege, müsste es funktionieren, oder? Und es wäre wesentlich speicherfreundlicher, davon mal abgesehen.