Datenbankabfragen eines Forums

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

  • Datenbankabfragen eines Forums

    Hallo allerseits,

    für ein privates Projekt habe ich vor geraumer Zeit ein eigenes Forum programmiert, das lediglich über einen Bruchteil der in kommerziellen Foren angeboteten Funktionen verfügen soll. Da mein Wissen über komplexe SQL-Abfragen leider noch begrenzt ist, scheitere ich derzeit an der Datenbankabfrage, die mir in der Forenübersicht die vorhandenen Foren auslesen soll und ausgeben soll, ob in einem der Foren ein Thema noch ungelesene Beiträge enthält.

    Ich speichere derzeit die Forendaten in folgenden Tabellen:

    Quellcode

    1. ---- Tabellenstruktur für Tabelle `forums`
    2. --
    3. CREATE TABLE `forums` (
    4. `id` int(11) NOT NULL auto_increment,
    5. `order` int(11) NOT NULL,
    6. `name` varchar(255) NOT NULL,
    7. `lastthread` int(11) NOT NULL,
    8. `private` int(2) default NULL,
    9. PRIMARY KEY (`id`)
    10. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    11. -- --------------------------------------------------------
    12. --
    13. -- Tabellenstruktur für Tabelle `postings`
    14. --
    15. CREATE TABLE `postings` (
    16. `id` int(11) NOT NULL auto_increment,
    17. `userid` int(11) NOT NULL,
    18. `threadid` int(11) NOT NULL,
    19. `time` int(11) NOT NULL,
    20. `text` text NOT NULL,
    21. PRIMARY KEY (`id`)
    22. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    23. -- --------------------------------------------------------
    24. --
    25. -- Tabellenstruktur für Tabelle `threads`
    26. --
    27. CREATE TABLE `threads` (
    28. `id` int(11) NOT NULL auto_increment,
    29. `userid` int(11) NOT NULL,
    30. `forumid` int(11) NOT NULL,
    31. `time` int(11) NOT NULL,
    32. `title` varchar(255) NOT NULL,
    33. `sticky` int(11) NOT NULL,
    34. PRIMARY KEY (`id`)
    35. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    36. -- --------------------------------------------------------
    37. --
    38. -- Tabellenstruktur für Tabelle `threadstatus`
    39. --
    40. CREATE TABLE `threadstatus` (
    41. `userid` int(11) NOT NULL,
    42. `threadid` int(11) NOT NULL,
    43. `time` int(11) NOT NULL
    44. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    Alles anzeigen



    Die Tabelle threadstatus enthält, wie leicht zu sehen, den Zeitpunkt des letzten Zugriffs eines Benutzers x auf ein Thema y. Sofern kein Eintrag zu einem Thema von einem Benutzer vorhanden ist, wurde das Thema noch gar nicht besucht und gilt folglich als ungelesen.

    Folgende SQL-Abfragen nutze ich derzeit:

    Liste aller Foren

    Quellcode

    1. SELECT f.id, f.order, f.name, f.lastthread AS threadid, (
    2. SELECT t.title
    3. FROM threads t
    4. WHERE t.id = f.lastthread
    5. ) AS threadtitle, (
    6. SELECT t.time
    7. FROM threads t
    8. WHERE t.id = f.lastthread
    9. ) AS threadtime
    10. FROM forums f
    11. ORDER BY f.order ASC
    Alles anzeigen



    Liste aller Themen in einem Forum

    Quellcode

    1. SELECT t.id, t.sticky, t.userid, t.forumid, t.title, t.time AS threadtime, (
    2. SELECT IF( s.time < t.time, 0, 1 )
    3. FROM threadstatus s
    4. WHERE s.userid = '1'
    5. AND t.id = s.threadid
    6. ) AS
    7. STATUS FROM threads t
    8. WHERE t.forumid = '1'
    9. ORDER BY t.sticky DESC , t.time DESC


    Ich möchte nun gern gewissermaßen die Funktionalität beider Abfragen kombiniert wissen, eben um in der Forenübersicht herauszufinden, ob in diesem Forum noch Themen mit ungelesenen Beiträgen bzw. ungelesene Themen enthalten sind und diese als Variable (wie bei der Forenansichts-Abfrage: STATUS) ausgeben.

    Kann mir jemand helfen, das zu bewerkstelligen, oder ist meine Datenbankkonzeption sowieso falsch gedacht?

    Danke vorab,
    Philipp
  • Die Abfrage funktioniert leider nicht wie erwartet, was aber auch kein Wunder ist. Ich schrieb oben, dass ungelesene Themen keinen Eintrag haben. Es kann jedoch auch Themen mit Beiträgen geben, die neuer sind als der Zeitpunkt des letzten Zugriffs, sprich ein altes Thema enthält neue Beiträge. Diese Möglichkeit wird derzeit nicht in der Abfrage genutzt (ist jedoch in 95% der Fälle relevant).

    Beispiel:

    Quellcode

    1. INSERT INTO `threadstatus` (`userid`, `threadid`, `time`) VALUES (1, 1, 1208733525);

    Quellcode

    1. INSERT INTO `threads` (`id`, `userid`, `forumid`, `time`, `title`, `sticky`) VALUES (1, 1, 1, 1208733599, 'Todo fürs Forum', 1),


    In diesem Fall gibt es einen Eintrag zu dem Thema von dem Benutzer mit der #1. Das Thema wurde folglich schon einmal gelesen. Der letzte Beitrag der eingefügt wurde, ist jedoch jüngeren Datums als der Zeitpunkt des letzten Themenbesuchs des Benutzers #1. Folglich muss das Thema als ungelesen markiert werden.