Gerd H.: Letzten Beträge aus Forum

Hallo,

MySQL Version 4.1: Ich möchte mir in meinem Forum die letzten 10 Beträge anzeigen lassen. Zusätzlich brauche ich die Anzahl der Beiträge innerhalb der Threads, um auf die letzte Seite zu verlinken. Irgendwie klappt das mit der Abfrage nicht ganz :)

  
mysql> SELECT * FROM thread LIMIT 0,3;  
+----+---------+--------------------+---------------------------------------+--------+----------+---------+------------+  
| id | aufrufe | titel              | beschreibung                          | closed | forum_id | wichtig | lasttime   |  
+----+---------+--------------------+---------------------------------------+--------+----------+---------+------------+  
|  1 |    2038 | Bist du zufrieden? | Wie gefällt euch die neue Community?  |      0 |        8 |       1 | 1175281727 |  

  
mysql> SELECT * FROM beitrag LIMIT 3,1;  
+------+-----------+--------+-----------+----------+---------------------------------+------------+----+  
| b_id | thread_id | von_id | edit_time | edit_von | kommentar                       | time       | ip |  
+------+-----------+--------+-----------+----------+---------------------------------+------------+----+  
|    7 |         1 |      3 |         0 |          | Tut mir Leid mein Fehler... :9: | 1152125083 |    |  
+------+-----------+--------+-----------+----------+---------------------------------+------------+----+  

Mein erster Versuch:

  
SELECT b.thread_id, t.forum_id, t.beschreibung, t.titel, b.time, u.username  
FROM thread AS t  
INNER JOIN beitrag AS b ON t.id=b.thread_id  
INNER JOIN user AS u ON (SELECT MAX(b.von_id) FROM beitrag)=u.id  
WHERE t.forum_id NOT IN ( 13, 14 )  
GROUP BY t.id  
ORDER by t.lasttime DESC LIMIT 8  

  1. Ich bin jetzt ein wenig weiter gekommen. Habe jetzt auch fast die richtigen Ergebnisse als Ausgabe. Allerdings wollte ich nach Möglichkeit das lasttime aus der Tabelle "Thread" raus haben, da man da bestimmt auch über b.time drauf zugreifen kann.

      
    SELECT b.thread_id, t.forum_id, t.beschreibung, t.titel, b.time, u.username  
    FROM thread AS t  
    INNER JOIN beitrag AS b ON t.id=b.thread_id  
    INNER JOIN user AS u ON b.von_id=u.id  
    WHERE t.forum_id NOT IN ( 13, 14 ) AND t.lasttime=b.time  
    GROUP BY t.id  
    ORDER by b.time DESC LIMIT 8  
    
    
    1. Ok bin wieder weiter gekommen... danke für die Hilfe!

      Was mir jetzt noch fehlt, wäre in der Abfrage unterzubringen, wieviele Beiträge der jeweilige Thread hat. Dann kann ich direkt auf die letzte Seite verlinken.

        
      SELECT b.thread_id, t.forum_id, t.beschreibung, t.titel, b.time, u.username  
      FROM thread t, beitrag b  
      INNER JOIN user u ON b.von_id = u.id  
      WHERE t.forum_id NOT  
      IN ( 13, 14 )  
      AND b.time = t.lasttime  
      ORDER BY b.time DESC  
      LIMIT 8  
      
      
      1. yo,

        Was mir jetzt noch fehlt, wäre in der Abfrage unterzubringen, wieviele Beiträge der jeweilige Thread hat. Dann kann ich direkt auf die letzte Seite verlinken.

        dann wollen wir deinen tatendrang nicht stoppen und nur einen tipp geben, korellierte unterabfrage sollte zumgewüsnchten ergebnis führen.

        PS: NOT und IN Operator besser in eine zeile schreiben, liesst sich besser.

        Ilja

        1. dann wollen wir deinen tatendrang nicht stoppen und nur einen tipp geben, korellierte unterabfrage sollte zumgewüsnchten ergebnis führen.

          Das einzige was ich hinbekomme ist:

            
          SELECT b.thread_id, t.forum_id, t.beschreibung, t.titel, b.time, u.username, (SELECT COUNT(*) FROM beitrag WHERE ????) AS anzahl  
          FROM thread t, beitrag b  
          INNER JOIN user u ON b.von_id = u.id  
          WHERE t.forum_id NOT IN ( 13, 14 )  
          AND b.time = t.lasttime  
          ORDER BY b.time DESC  
          LIMIT 8  
          
          

          Allerdings liefert mir das ja die Anzahl aller Beiträge. Komme irgendwie nicht drauf, wie ich das auf den jeweiligen Thread begrenze. (???)

          Da brauche ich noch einen kleinen Tipp denke ich :/.

          PS: NOT und IN Operator besser in eine zeile schreiben, liesst sich

          So besser? ;)

          1. yo,

            Allerdings liefert mir das ja die Anzahl aller Beiträge. Komme irgendwie nicht drauf, wie ich das auf den jeweiligen Thread begrenze. (???)

            bist ja schon fast bei der lösung, eine unterabfrage hast du schon. jetzt nur noch das wort korelliert umsetzen, sprich eine unterabfrage, die einen bezug zu der äußeren abfrage hat, in deinem falle einen bezug in der where klausel der unterabfrage.

            tipp dafür, gebe der tabelle beitrag in der unterabfrage auch einen endeutigen aliasnamen, um dann den bezug herstellen zu können.

            Ilja

            1. yo,

              noch ein kleiner tipp, du benutzt die falsche tabelle in der unterabfrage, nicht beitrage, sondern threads zu einem beitrag willst du ja zählen....

              Ilja

              1. noch ein kleiner tipp, du benutzt die falsche tabelle in der unterabfrage, nicht beitrage, sondern threads zu einem beitrag willst du ja zählen....

                Eigentlich wollte ich schon die Beiträge zu den Ausgegeben Threads zählen, um dann auf die letzte Seite des Threads zu verlinken.

            2. bist ja schon fast bei der lösung, eine unterabfrage hast du schon. jetzt nur noch das wort korelliert umsetzen, sprich eine unterabfrage, die einen bezug zu der äußeren abfrage hat, in deinem falle einen bezug in der where klausel der unterabfrage.

              tipp dafür, gebe der tabelle beitrag in der unterabfrage auch einen endeutigen aliasnamen, um dann den bezug herstellen zu können.

                
              SELECT b.thread_id, t.forum_id, t.beschreibung, t.titel, b.time, u.username, (  
              SELECT COUNT( * )  
              FROM beitrag AS be  
              WHERE be.thread_id = t.id  
              ) AS anzahl  
              FROM thread t, beitrag b  
              INNER JOIN user u ON b.von_id = u.id  
              WHERE t.forum_id NOT IN ( 13, 14 ) AND b.time = t.lasttime  
              ORDER BY b.time DESC  
              LIMIT 8  
              
              

              Habe ich soweit gemacht. Für mich sieht es jetzt logisch aus. Als Ausgabe erhalte ich, dass die Tabelle "b" nicht existiert.

              Die Unterabfrage sollte sich auf die äußere beziehen und das habe ich in dem WHERE der Unterabfrage geregelt.

              Was mich wundert ist, dass ich nachdem ich mich ein wenig zu korrellierten Unterabfragen informiert habe, nicht einmal gesehen habe, dass Unterabfragen in dem SELECT-Bereich stehen. Ist das denn überhaupt möglich?

              Bin ich auf dem Holzweg?

              1. yo,

                du solltest die tabelle thread und beitrag auch als inner join miteinander verbinden und vor allem auch die join bedingung mit reinnehmen.

                  
                SELECT b.thread_id, t.forum_id, t.beschreibung, t.titel, b.time, u.username, (  
                SELECT COUNT( * )  
                FROM beitrag be  
                WHERE be.thread_id = t.id  
                ) AS anzahl  
                FROM thread t  
                INNER JOIN beitrag b ON b.thread_id = t.id  
                INNER JOIN user u ON b.von_id = u.id  
                WHERE t.forum_id NOT IN ( 13, 14 )  
                AND b.time = t.lasttime  
                ORDER BY b.time DESC  
                LIMIT 8  
                
                

                Was mich wundert ist, dass ich nachdem ich mich ein wenig zu korrellierten Unterabfragen informiert habe, nicht einmal gesehen habe, dass Unterabfragen in dem SELECT-Bereich stehen. Ist das denn überhaupt möglich?

                ja, das ist möglich

                Ilja

                1. du solltest die tabelle thread und beitrag auch als inner join miteinander verbinden und vor allem auch die join bedingung mit reinnehmen.

                  Klingt logisch. Für mich sieht die Abfrage auch aus als wenn sie funktionieren sollte. Allerdings erhalte ich nach ca. 30 sek. in PHPmyAdmin die folgende Ausgabe:

                  "Table 'tabelle.b' doesn't exist "

                  Weisst du weiter Ilja? Danke erstmal auch für die Mühe bis hier hin.

                  1. yo,

                    "Table 'tabelle.b' doesn't exist "

                    wenn ich das richtig interpretiere, dann hast du irgendwo im statement vor dem aliasnamen b noch den präfix tabelle gesetzt, sprich irgendwo steht "tabelle.b", was natürlich keinen sinn macht, da mit b ja schon die tabelle identifiziert ist.

                    Ilja

                    1. wenn ich das richtig interpretiere, dann hast du irgendwo im statement vor dem aliasnamen b noch den präfix tabelle gesetzt, sprich irgendwo steht "tabelle.b", was natürlich keinen sinn macht, da mit b ja schon die tabelle identifiziert ist.

                      Sorry mein Fehler. Ich meine nicht tabelle.b, sondern DB.b wobei DB der Name meiner Datenbank ist in der die Tabellen liegen.

                      Stehe da irgendwie auf dem Schlauch.

      2. Was mir jetzt noch fehlt, wäre in der Abfrage unterzubringen, wieviele Beiträge der jeweilige Thread hat. Dann kann ich direkt auf die letzte Seite verlinken.

        Dann muss du auch die beiden Tabellen miteinander verbinden. In etwa so

          
        SELECT b.thread_id, t.forum_id, t.beschreibung, t.titel, b.time, u.username  
        FROM thread t LEFT JOIN beitrag b USING(thread_id)  
        ...
        

        Was mich ein bisschen wundert ist das:

        AND b.time = t.lasttime

        allerdings weiß ich nicht was b.time ist, falls das einfach der Zeitstempel des letzten Eintrags ist, dann könntest du diesen auch in den JOIN miteinbauen.

        SELECT b.thread_id, t.forum_id, t.beschreibung, t.titel, b.time, u.username  
        FROM thread t LEFT JOIN beitrag b on b.thread_id = t.thread_id AND b.time = t.lasttime  
        ...  
        
        

        Struppi.

        --
        Javascript ist toll (Perl auch!)
        1. Was mich ein bisschen wundert ist das:

          AND b.time = t.lasttime

          allerdings weiß ich nicht was b.time ist, falls das einfach der Zeitstempel des letzten Eintrags ist, dann könntest du diesen auch in den JOIN miteinbauen.

          b.time ist der Zeitstempel eines Beitrags. lasttime ist ein Datenfeld wo die letzte Zeit des letzten Beitrags abgespeichert wird.

          Mir ist einfach nichts besseres eingefallen.

          Wie kann ich denn genau auf die Anzahl der Beiträge in den 8 angezeigten Threads kommen? Mit einer Unterabfrage schaffe ich das lediglich die Anzahl aller Beiträge in der SELECT-Zeile unterzubringen.