Tach, ich habe eine Tabelle in der Form |DATUM|KOMMENTAR| |1.1.08|Neujahr eben| |31.5.07|Geburtstag von jemandem| |8.3.08|Namestag von einigen| Mich interessiert nun der Kommentar des jüngsten Datums. Mit SELECT MAX(DATUM) FROM TABELLE das jüngste Datum herauszubekommen ist ja kein Problem, aber wie hole ich mir den Kommentar dazu ? Ja mann
Uhhhh, Vorsicht... die Aggregatfunktion rattert da über sämtliche Zeilen... Machs doch so: 1. Sortieren, 2. Limitieren
1 | SELECT * FROM deine_tabelle ORDER BY datum DESC LIMIT 1 |
Hmm...*grübel*, ich glaub, du weißt, was ich meine. Gugg aber mit der Abfrage nochmal nach, hab schon ewig nix mehr mit SQL gemacht.
Ahhh, super! Hatte zwar vergessen zu sagen dass ich Firebird benutze und es da kein Limit gibt, aber dafür gibt es ein "FIRST", dass mit nur den ersten Datensatz anzeigt. Mit einer umgekehrten Sortierung ist das dann auch erledigt. Besten Dank! Ja mann
Normalerweise sollte das auch mit MAX gehen. Entweder mit einer Subquery:
1 | SELECT KOMMENTAR FROM TABELLE WHERE DATUM = (SELECT MAX(DATUM) FROM TABELLE) |
oder mittels GROUP BY:
1 | SELECT KOMMENTAR, MAX(DATUM) FROM TABELLE GROUP BY KOMMENTAR |
Hab aber keine Ahnung, ob Firebird dabei auch mitspielt. CU
@FBI: Ja, geht schon. Ist aber reichlich umständlich: Entweder zwei Abfragen (mit Unterabfrage!) oder ein Group-By über ein Textfeld -- beides ist nicht gerade effizient. Könnte letztlich auch seltsam ausarten, wenn mehrere Datensätze das gleiche Datum haben.
Hallo,
>
1 | SELECT KOMMENTAR FROM TABELLE WHERE DATUM = (SELECT MAX(DATUM) FROM |
2 | > TABELLE) |
Dies ist bei Firebird die schnellste Möglichkeit an das Datum und den Kommentar zukommen, wenn auf das Datum ein Index liegt. Dann spielen die dahinter liegenden Datenmengen keine Rolle mehr. > oder mittels GROUP BY: >
1 | SELECT KOMMENTAR, MAX(DATUM) FROM TABELLE GROUP BY KOMMENTAR |
>
Diese Variante kann nur verwendet werden, wenn KOMMENTAR keine BLOB ist,
wird aber wahnsinnig langsam, weil auf KOMMENTAR wahrscheinlich kein
Index liegen würde. Hinzu kommt, dass die Wahrscheinlichkeit das der
Optimizer hier zu schlagen eher gering ist.
Aber auch bei der ersten Variante gibt es das Problem, wenn Du nur den
letzten Kommentar zu einem Datum haben willst, dass Du bei zwei
Einträgen an einem Tag nicht unbedingt den letzten bekommen wirst.
Es sein denn, Dein Datum ist ein Timestamp, oder Deine Tabelle wird mit
einer zusätzlichen ID versehen die als primary key fungiert.
Ich würde die Variante mit der ID verwenden, da ich dann sicher bin,
dass der Datensatz mit der größten ID auch den letzten Kommentar
enthält.
Das Füllen der ID kann über einen BEFOREINSERT-Trigger auf der Datenbank
direkt erfolgen. Ich nutze dazu die Firebird Funktion GEN_ID in
Verbindung mit einem Generator.
1 | SELECT KOMMENTAR FROM TABELLE WHERE ID = ( SELECT MAX(ID) FROM TABELLE ) |
Wichtig bei dieser Variante ist, das das Feld ID unbedingt PRIMARYKEY sein muss und vom Typ INTEGER, dann erreichst Du auch bei größten Datenmengen beste Performance. Gruß Frank
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.