Du bist nicht eingeloggt.

Login

Pass

Registrieren

Community
Szene & News
Locations
Impressum

Forum / Bits und Bytes

Mysql: MAX() und MIN() in LEFT JOIN

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 ;-)
  [Antwort schreiben]

Forum / Bits und Bytes

(c) 1999 - 2026 team-ulm.de - all rights reserved - hosted by ibTEC Team-Ulm

- Presse - Blog - Historie - Partner - Nutzungsbedingungen - Datenschutzerklärung - Jugendschutz -