franzy_1992 - 34
Halbprofi
(offline)
Dabei seit 10.2007
130
Beiträge
|
Geschrieben am: 27.03.2008 um 23:15 Uhr
Zuletzt editiert am: 27.03.2008 um 23:23 Uhr
|
|
Sersdew,
wie kann ich in einem 4fachen LEFT JOIN zusätliche eine MIN() und eine MAX() Funktion als Bedingung angeben?
Genauer gesagt:
Ich hab ein Forum, in diesem Forum will ich in der Übersicht anzeigen, wer den Thread erstellt hat und wer den letzten Beitrag geschrieben hat.
Das heisst:
autor_id ist abhängig von MIN(post_time) und forum_id
last_poster_id ist abhängig von MAX(post_time) und forum_id
Nur wie krieg ich das in eine Abfrage rein?
Wichtig ist, dass ich am Schluss nur EINE Abfrage habe und nicht mehrere.
Zusatzinformationen:
Tabellen
----------
posts: post_id, poster_id, post_time, thread_id
users: user_id (->posts.poster_id), user_nick
threads: thread_id (->posts.thread_id), forum_id, thread_name
Bei jedem neuen Beitrag wird ein neuer Datensatz in posts angelegt.
Man erkennt den ersten Beitrag eines Threads an der niedrigsten post_time und den letzen an der höchsten post_time.
Wie kann ich jetzt also diese bedingung in meine abfrage einbauen?
tschüssle
|
|
ThErEaLdEaL - 35
Halbprofi
(offline)
Dabei seit 04.2006
285
Beiträge
|
|
Geschrieben am: 27.03.2008 um 23:53 Uhr
|
|
mhhh....hab selbst wenig ahnung von mysql.
Was für ne forensoftware hasu? Komplett selber geschrieben oder schon eine vorhandene??
.Schau nich so doof.
|
|
franzy_1992 - 34
Halbprofi
(offline)
Dabei seit 10.2007
130
Beiträge
|
|
Geschrieben am: 28.03.2008 um 00:03 Uhr
|
|
bin gerade dabei, selber ein forum zu entwickeln
|
|
S3B1 - 36
Anfänger
(offline)
Dabei seit 11.2005
6
Beiträge
|
|
Geschrieben am: 28.03.2008 um 00:26 Uhr
|
|
Zitat von franzy_1992: Sersdew,
wie kann ich in einem 4fachen LEFT JOIN zusätliche eine MIN() und eine MAX() Funktion als Bedingung angeben?
Genauer gesagt:
Ich hab ein Forum, in diesem Forum will ich in der Übersicht anzeigen, wer den Thread erstellt hat und wer den letzten Beitrag geschrieben hat.
--> Welcher Übersicht? Übersicht über die Unterforen oder die Threads?
Das heisst:
autor_id ist abhängig von MIN(post_time) und forum_id
last_poster_id ist abhängig von MAX(post_time) und forum_id
Nur wie krieg ich das in eine Abfrage rein?
Wichtig ist, dass ich am Schluss nur EINE Abfrage habe und nicht mehrere.
--> Du lässt dir einfach alle Nummer geben, die zu dem Thread gehören, die erste Nummer ist author_id, du gehst das Array bis zum Schluss durch, die letzte Nummer ist last_poster_id.
Zusatzinformationen:
Tabellen
----------
posts: post_id, poster_id, post_time, thread_id
users: user_id (->posts.poster_id), user_nick
threads: thread_id (->posts.thread_id), forum_id, thread_name
Bei jedem neuen Beitrag wird ein neuer Datensatz in posts angelegt.
Man erkennt den ersten Beitrag eines Threads an der niedrigsten post_time und den letzen an der höchsten post_time.
Wie kann ich jetzt also diese bedingung in meine abfrage einbauen?
tschüssle
|
|
ThErEaLdEaL - 35
Halbprofi
(offline)
Dabei seit 04.2006
285
Beiträge
|
|
Geschrieben am: 28.03.2008 um 00:43 Uhr
|
|
Würd bissl googlen und vllt. in nem anderen Forum nachfragen, die in die richtung gehen, kann mir nur schwer vorstellen das du von hier gute Antworten bekommst und wenn dann nur wenig.
Würd dir gern helfen, aber dafür weiß ich darüber zuwenig, ums zulernen hatt ich leider zuwenig zeit :)
Aber viel glück!
.Schau nich so doof.
|
|
S3B1 - 36
Anfänger
(offline)
Dabei seit 11.2005
6
Beiträge
|
|
Geschrieben am: 28.03.2008 um 01:00 Uhr
|
|
Du nutzt schon PHP um die Anfragen auszuwerten?
Gruß
P.S.: Bei genauerem Hinsehen fällt auf, dass im Zitat die Antworten zu finden sind.
|
|
DJ85 - 40
Anfänger
(offline)
Dabei seit 03.2008
8
Beiträge
|
|
Geschrieben am: 28.03.2008 um 01:06 Uhr
|
|
Zitat von franzy_1992: bin gerade dabei, selber ein forum zu entwickeln
Ach ja was für eins darf ich mal raten.
|
|
aFriend4U - 61
Fortgeschrittener
(offline)
Dabei seit 06.2006
58
Beiträge
|
|
Geschrieben am: 28.03.2008 um 01:32 Uhr
|
|
select threads.forum_id, threads.thread_id, threads.forum_name,
pmin.thread_id, pmin.post_id, pmin.poster_id, usermin.user_name,
pmax.thread_id, pmax.post_id, pmax.poster_id, usermax.user_name
from threads
left join ( select thread_id, post_id,poster_id
from posts
where post_time = ( select min(post_time) from posts as p2
where p2.thread_id = posts.thread_id group by p2.thread_id)
) as pmin on threads.thread_id = pmin.thread_id
left join ( select thread_id, post_id, poster_id
from posts
where post_time = ( select max(post_time) from posts as p2
where p2.thread_id = posts.thread_id group by p2.thread_id)
) as pmax on threads.thread_id = pmax.thread_id
left join users as usermin on usermin.user_id = pmin.poster_id
left join users as usermax on usermax.user_id = pmax.poster_id
;
Also ich habe den Umweg über die posts.post_id genommen, da ich davon ausgehe, daß diese Spalte eindeutig (unique index) in der Tabelle posts ist, was von post_time nicht zwingend behauptet werden kann.
Der 1. left-join holt den posts-Satz mit der min(post_time)
Der 2. let-join holt den posts-Satz mit der max(post_time)
Die beiden left-join users holen die Userdaten dazu. So bekommst du auch einen Satz aus threads auch wenn kein posts-Satz existiert. Wenn du die beiden left wegläßt, bekommst du nur einen Satz, wenn auch ein posts-Satz existiert.
Save the planet
|
|
McPommes - 51
Experte
(offline)
Dabei seit 09.2006
1422
Beiträge
|
|
Geschrieben am: 28.03.2008 um 10:52 Uhr
|
|
Wenn du das Forum selber erstellst, würd ich diese Infos in die Thread-Tabelle übernehmen. Schreib da einfach die ID des Erstellers rein und die des letzten Schreibers.
Dann hast du dein SQL um einiges erleichtert.
*** diese Fusszeile verschwendet 45 Bytes ***
|
|
franzy_1992 - 34
Halbprofi
(offline)
Dabei seit 10.2007
130
Beiträge
|
Geschrieben am: 28.03.2008 um 12:48 Uhr
Zuletzt editiert am: 28.03.2008 um 12:49 Uhr
|
|
hab jetzt die Lösung
Stichwort Subselects....
das beste daran ist, dass die komplette datenbank normalisiert ist alles voll relational und dynamisch. wie ich das haben will 
ist zwar ne echte monsterabfrage, aber dank dem SQL-Cache dauert die beim ersten mal 0,01 sek und bei den weiteren malen 0,002 sek.....
wer sie haben will --> PM
will die hier ungern posten
|
|