Das wiederum erachte ich als Schmarrn. Wahrscheinlich habe ich in den letzten Jahren einfach mit zu guten Datenbanken gearbeitet, aber jedes mir bekannte Datenbanksystem unterstützt in der einen oder anderen Form Subqueries, wie es ja auch im SQL-Standard beschrieben ist. Nicht umsonst gibt es die Ausdrücke IN(subquery), SOME/ANY,EXISTS.. Wird nun etwas zu Off-Topic hier. Das Problem ist einfach, dass es immer wieder Abfragen gibt, die ohne Unterabfragen schwer oder gar nicht zu lösen sind.
Mit Unterabfragen lässt sich auch das Problem von BadByte relativ einfach lösen, auch wenn ich das immernoch nicht sonderlich elegant finde. Aus irgendeinem Grund kam ich vorher nicht auf die Idee, anscheinend war ich mal wieder übermüdet:
Code:
SELECT t.autor,
t.datum,
t.title,
t.hits
(SELECT a.autor FROM forumantworten a WHERE t.id = a.themenid ORDER BY a.datum DESC LIMIT 1) AS letzter_poster,
(SELECT a.datum FROM forumantworten a WHERE t.id = a.themenid ORDER BY a.datum DESC LIMIT 1) AS letztes_datum,
FROM forumthemen t
Das ist die kürzeste, mit Sicherheit funktionierende Lösung (hab's gerade selber ausprobiert), die ich gerade anbieten kann - erfordert aber dummerweise wieder Unterabfragen. Diese Abfrage ist auch ohne Unterabfragen eine extrem harte Nuss, aber wahrscheinlich auch zu schaffen.
Was TheNoxier sagt, ist übrigens auch absolut richtig: Es ist eine gute Idee, den letzten Beitrag (oder die zugehörigen Daten) mit in die Themen-Tabelle abzuspeichern, wodurch du dir hier den ganzen Aufwand sparst. Dadurch brauchst du zwar bei jedem neuen Beitrag eine UPDATE oder INSERT-Anweisung, aber es ist ja davon auszugehen, dass mehr im Forum gelesen als geschrieben wird, weswegen das die Datenbank entlasten kann. Datenbanktechnisch ist das streng genommen eine ungern gesehene Redundanz, aber der Zweck heiligt eben manchmal die Mittel. Große Forum-Systeme wie vBulletin machen das übrigens genauso, da gibt es in der Thread-Tabelle auch die Spalten "lastpost" (Timestamp) und "lastposter" (Benutzername).