Letzten Beträge aus Forum
Gerd H.
- datenbank
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
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
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
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
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? ;)
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
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
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.
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?
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
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.
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
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.
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.
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.