sorry, ich hab den mysqld schon wieder crashen lassen. (verdammt)
jetzt weiss ich wenigstens in welcher region das problem liegt. und zwar hat er offenbar mühe mit join's von grösseren datenmengen. bei diesem query ist er gecrasht:
SELECT c.* FROM comments c LEFT JOIN comments t ON (t.thread_id=c.thread_id AND t.date>c.date) WHERE t.id IS NULL ORDER BY c.date DESC
Der Join lässt sich nicht schöner machen, trotz Index. Hab dasselbe mal vor ein paar Monaten probiert. Ich denke eine Thread Tabelle lässt sich nicht umgehen.
Die grosse Frage ist dann nur noch wie wirds mit den Non-Forum Posts machen.
die müssen auch einen eintrag in der thread-table haben. wichtig ist dafür nur die thread_id, der lastpost und das board. der rest kann man aus den anderen tables holen.
Normale Posts würden dann einfach auch einen Thread generieren sobald er benötigt wird.
Seh ich das richtig, dass in der Thread Tabelle anschliessend hinterlegt ist, wohin (Forum, Wiki, Smarty ...) ein Thread gehört und seine ID.
Der eigentliche Content des Ersten Posts bleibt weiterhin als Eintrag in Comments.
Das Query kann auch gar nicht Funktionieren.
Es gibt nämlich hoffentlich keine t.id die NULL sind.
Höchstens solche die '0' sind, aber auch von denen gibts keine.
Was willst du denn genau mit dem Query machen?
Offensichtlich versucht er mit diesem Query sämtliche neuste Posts pro Thread nach deren Datum aufzulisten. Eigentlich noch elegant, wäre nicht auf diese Lösung gekommen, aber schade wenns Performance-Mässig nicht drinliegt.
Biko: Eventuell würde ein Index (Thread_id, Date) etwas nützen?
kann ich machen. woher soll ich bei templates und gallery das thread-datum und den thread-starter nehmen? bei templates kann dafür die daten des templates nehmen. aber für die pics?
durch die bedingung t.date>c.date im join gibt es genau ein result pro thread, wo die t.id NULL ist. und das ist der datensatz, wo das datum am grössten ist. neben einem subquery (das es bei der installierten mysql-version nicht gibt) ist das die einzige möglichkeit den ganzen datensatz zum maximalen datum pro thread zu bekommen.
Mit dem eigenen Server hätten wir das Problem, das irgend jemand die Sache warten müsste genau gleich, und diese Person (ich nehm mal an wir würden dich dafür anstellen) wär auch nicht gratis.
Entweder bin ich immer noch zu muede um mich gescheit auszudruecken, oder du willst mich momentan einfach falsch verstehen.
Ich probiers nochmal:
Ich (Lukas Beeler), wuerde falls ihr (der Zooomclan) euch einen eigenen Server (bei Sylon oder einer anderen Firma, von mir aus auch einem privaten) auf euren (des Zooomclans) Wunsch hin die Wartung (Administration, Upgrades, etc.) als Freundschaftsdienst (d.h. ohne das fuer euch irgendwelche Kosten entstehen, ausgenommen natuerlich HW Einkaeufe, Ersatzteile, etc. pp.) uebernehmen.
Hm, langsam begin ich das ganze zu begreifen.
Die Linke Seite wird immer Angezeigt, die Rechte jedoch nur wenn was gefunden wird.
Es gibt pro Thread genau einmal Rechts nichts, nähmlich da wo das Datum am grössten ist.
Ich hab (wie an den Letzten beiden DB Prüfungen) den LEFt JOIN mit irgendwas anderem verwechselt..
Ich probiers mal mit einem Workaround.
Select *, max(date) as datum from comments group by thread_id order by datum desc
Liefert den Neusten Post pro Thread, und ich finds es ist ziemlich schnell.
Ich weiss was mit Boards gemeint ist. Deshalb war ich überrascht als du sagtest dass deine Selektion gleich aussieht und trotdem nicht die Posts aus allen Boards zusammengezogen wurden.
es sind schon alle posts drin. aber wir brauchen noch die trhead-info. z.b. den title aus dem smarty.
das hauptproblem liegt darin, den neuesten post zu finden. das ist auch der haupt-grund, wieso wir ne thread-table wollen. wenn das da funktionieren würde, bräuchten wir keine threads-table.
Jo klar, so müsste mans dann glaub machen: (statt lastpostdate natürlich mit lastpostid)
SELECT comments.board, comments.thread_id, max( comments.lastpost ) AS lastpostdate, lastpost.id AS lastpostid, lastpost.text
FROM `comments`
LEFT JOIN comments AS lastpost ON ( lastpost.date = comments.lastpost )
GROUP BY comments.thread_id
ORDER BY lastpostdate DESC
LIMIT 0 , 30