Sven Rautenberg: inner join bis heute nicht begriffen

Beitrag lesen

Moin!

Du hast allerdings das Problem, dass ein
SELECT user, min(datum) FROM tabelle GROUP BY user
dir zwar die Benutzer-ID und das kleinste Datum bringt, du aber nicht einfach weitere Postinginhalte hinzuselektieren kannst - GROUP BY wüßte nicht, welcher Eintrag zu wählen ist.

wow...hier hab ich gleich 2 sachen gesehen, die ich nicht kenne!
min(datum).... und group BY (wobei ich das by nicht verstehe)

sei mir nicht böse, wenn ich das alles frage..aber ich möchte alle funktionen optimal nutzen können, und bin über jede antwort froh, die mir irgendwie nutzen kann.

Die beiden Dinge hängen eng miteinander zusammen.

GROUP BY (als ein Befehl zu betrachten) gruppiert die danach angegebenen Spalten, d.h. identische Einträge ziehen die beteiligten Zeilen zu einer zusammen:

Wenn du ohne GROUP BY folgendes Ergebnis kriegst:
SELECT user_id, datum, text FROM tabelle
user_id  datum    text
3        20021201 irgendwas
3        20021204 irgendwas anderes

dann kannst du alle Postings von User-ID 3 zusammenfassen mit "GROUP BY user_id" und erhälst nur noch eine Zeile:
SELECT user_id FROM tabelle GROUP BY user_id
user_id
3

Das Problem ist: Du hast zwei Zeilen zusammengefaßt, die auch noch andere Felder enthalten. Wenn du die aber einfach mit ausgeben willst:
SELECT user_id, datum, text FROM tabelle GROUP BY user_id
dann hast du das Problem: Welcher Eintrag von den beiden in der Tabelle enthaltenen soll in der resultierenden Zeile enthalten sein?

Mit
SELECT user_id, min(datum) FROM tabelle GROUP BY user_id
erhälst du als Datumseintrag das niedrigste (früheste) Datum:
user_id  min(datum)
3        20021201

Du kriegst aber leider das dazugehörige Textfeld nicht, weil auch der Text irgendwie mit einer sogenannten Aggregatsfunktion ausgewählt werden muß. MySQL nimmt zufällige Werte, wenn du es mit
SELECT user_id, min(datum), text FROM tabelle GROUP BY user_id
dennoch versuchst, andere Datenbanken geben einen Fehler zurück.

Angenommen, Forum: test
Ich habe in der Übersicht ein forum (das themen und antworten enthält), und möchte ausgeben, was zuletzt in diesem forum los war.

Wie finde ich am effektivsten raus, ob zuletzt ein datum erstellt worden ist, oder zuletzt eine antwort geschrieben worden ist.

Meine derzeitige Methode: ich hol mir das datum vom letzten them, und das datum von der letzten antwort. dann vergleiche ich diese
if datum_lastthema > datum_lastantwort then...

Aha, deine Datenstruktur ist also für die zu lösende Aufgabe suboptimal. Ich würde in der Thementabelle nur solche Dinge wie Titel, Anfangsdatum etc. speichern, und in der Antwortentabelle auch schon gleich das erste Posting des Themas. Das erste Posting ist dann logischerweise die ursprüngliche Nachricht. Wenn zu deinem Thema nur eine Nachricht existiert, ist die aktuellste Nachricht logischerweise ein neues Thema - existieren mehr als eine Nachricht, ist die letzte Aktion eine Antwort gewesen.

SELECT count(datum), max(datum), thread_id FROM antwortentabelle GROUP BY thread_id

Das gibt dir einmal die Anzahl der Postings zurück, dann das Datum der letzten Änderung, und die thread_id. Und wenn du das Ausgangsposting nicht in der Antwortentabelle speicherst, hast du ein Problem: Wo nichts gespeichert ist, kann man nichts finden.

das problem ist aber: was, wenn die am gleichen tag geschrieben worden sind... dann müsste ich auch noch die uhrzeit vergleichen.

Es ist ohnehin schlau, einen ordentlichen Timestamp zu speichern, mit Datum und Uhrzeit bis hin zu Sekunden, evtl. auch Microsekunden. Dann kannst du eindeutig bestimmen, welches Posting das zeitlich letzte ist.

das habe ich nicht ganz verstanden. warum ersten eintrag-flag. ich weiß doch eh was der erste eintrag ist. themen/antworten sind ja 2 verschiedene tabellen. oder meinst du bei den antworten...welche die erste antwort?

Eine das Thema eröffnende Antwort ist kein spezielles Posting, so dass es nicht gerechtfertigt ist, diese in eine eigene Tabelle zu packen.

- Sven Rautenberg

--
Diese Signatur gilt nur am Freitag.