MoM: MySQL-Forum

Hi!
Ich schreibe gerade ein Forum (in Perl), dass auf MySQL aufbaut. Allerdings habe ich ein Problem: ich habe keine Ahnung wie ich die Threads so organisieren könnte, dass ich mit einer SELECT-Anweisung die Threads inkl. aller Postings in der richtigen Reihenfolge erhalte um die Threads anzuzeigen, so dass ich in Perl nur noch erkennen muss wenn ein neuer Ast kommt oder wenn einer geschlossen werden muss. Weiß jemand wie sowas gehen könnte? Oder ist es eine Schnapsidee von mir alles mit einer SELECT-Anweisung (aus Performance-Gründen) erledigen zu wollen? Ich ging einfach mal davon aus, dass es nicht sehr performant sei, wenn ich für jedes Posting eine eigene SELECT-Anfrage absetze, bei der Forums-Startseite könnte das dann ja mehrere hundert Select-Anfragen erfordern. Ich bin für alle Ratschläge dankbar.
Viele Grüße
MoM

  1. Hallo MoM,

    wie sind den Deine Postings in der Datenbank organisiert?
    Das bräuchten wir, um sagen zu können, ob es mit einem single-sql-statement geht oder nicht.

    Ich sage mal aus dem Bauch heraus, daß es durchaus mit einer einzigen SQL-Abfrage gehen kann, wobei man möglicherweise noch ein wenig unter Perl sortieren müsste.

    Aber erst mal die Tabellenstruktur bitte :-)

    Ciao, Vedat

    1. Hi Vedat,

      wie sind den Deine Postings in der Datenbank organisiert?
      Das bräuchten wir, um sagen zu können, ob es mit einem single-sql-statement geht oder nicht.

      Das ist ja eben das Problem ich hab zwar mit mehreren  Methoden herumprobiert (zuerst hatte jedes Posting ein Message-ID und eine Bezugs-ID (die ID des Postings auf das geantwortet wurde) aber dabei müsste ich dann ja für jede Ebene eine Select-Anweisung ausführen) aber es hat sich nichts als brauchbar erwiesen. Deshalb hätte mich interessiert wie ihr sowas organisiert habt / hättet (die Postings zu Threads verbinden, und das ganze abrufen).
      Viele Grüße
      MoM

      1. Hallo,
        was mich allgemein interessieren würde ist ob es überhaupt ein (großer) Vorteil ist alle Postings mit einer Select-Anweisung zu laden als für jedes eine eigene Anweisung abzusetzen.
        Viele Grüße
        MoM

      2. Hi MoM,

        müsste gehen,
        mach eine message-id, eine Bezugs-ID und eine Thread-ID.
        Bei der Thread-ID müsstest Du den letzten Wert woanders zwischenspeichern, damit Du beim eröffnen eines neuen Threads weißt, wie die nächste Thread-ID sein soll.
        Jede Antwort kriegt die selbe Thread-ID, die das Posting davor auch hat.

        Und jetzt:
        SELECT * FROM messages
        WHERE ...
        ORDER BY Thread_ID, bezugs_ID, message_id;

        ungetestet, aber müsste gehen. Probiers mal aus ...
        Bezugs-ID sollte bei neuen Threads immer Null sein... oder wie auch immer...

        Und: Ja, wenn Du es in eine SQL-Zeile packst, ist es schon schneller.

        Ciao, Vedat

        1. Hi Vedat,

          müsste gehen,
          mach eine message-id, eine Bezugs-ID und eine Thread-ID.
          Bei der Thread-ID müsstest Du den letzten Wert woanders zwischenspeichern, damit Du beim eröffnen eines neuen Threads weißt, wie die nächste Thread-ID sein soll.
          Jede Antwort kriegt die selbe Thread-ID, die das Posting davor auch hat.

          Und jetzt:
          SELECT * FROM messages
          WHERE ...
          ORDER BY Thread_ID, bezugs_ID, message_id;

          Funktioniert leider nicht :-( Sobald es nämlich mehr als zwei Ebenen gibt also zum Beispiel
          MESSAGEID BEZUGSID
          1         0
          2         1
          3         2
          4         2
          5         3
          dann wird die 5. Message als letzte angezeigt (obwohl die ja als Antwort auf die 3. gedacht ist).
          Trotzdem vielen Dank.

          Und: Ja, wenn Du es in eine SQL-Zeile packst, ist es schon schneller.

          Viele Grüße
          MoM

          1. Hallo nochmal,
            was mir gerade noch eingefallen ist, ist eine Kombination aus Thread-ID und ebene (1.1, 1.1.1, 1.2 usw.). Meint ihr das ist eine sinnvolle / gute Lösung (SELECT * FROM tabelle ORDER by thread_id, ebene)? Ein Problem wäre halt das bei ensprechenden Threads die Ebene ziemlich lang würde.
            Viele Grüße
            MoM