Passendes SELECT gesucht

Hallo !

Ich habe hier eine Tabelle, in der Messwerte sind:
id | spalte1 | spalte2 | … | datum

id enthält eine Nr der Messstelle, Datum das Datum der Erfassung. Die id ist daher nicht eindeutig, Primärschlüssel ist zusammengesetzt (id,datum).
Ich suche nun für jede ID die Zeile mit dem jeweils neuestem Datum (dieses Datum ist für viele IDs verschieden, mit MAX raussuchen und dann in’s WHERE schreiben geht daher nicht). Geht das direkt in SQL (mySQL) ? Eventuell in einer Abfrage ?
Weder mit WHERE, noch mit GROUP BY … HAVING bin ich weiter gekommen.

Alexander

SELECT id, Max(datum)
FROM Tabelle1
GROUP BY id;

Gruss, Simon

Hallo Simon !

Danke für deinen Code. Aber soweit war ich schon, das liefert mir zwar id+passendes Datum, aber nicht die dazugehörigen Werte in den anderen Spalten. Und diese kann ich da ja nicht mit in das SELECT aufnehmen, da ich nach den Werten nicht gruppieren kann.
Damit

SELECT id, Max(datum)
FROM Tabelle1
GROUP BY id;

und mit einer zusätzlichen Abfrage im Programm pro id/Datum Kombination geht es auch, aber das gibt etliche 1000 Queries, die ich irgendwie vermeiden wollte.

Alexander

Hallo Alexander

Dann würde ich die Abfrage nach dem grössten Datum im Programm machen.

datensatz = Select id, feld1, feld2, datum from tabelle order by id, datum;

while (datensatz.next() {
if (id != idmax) {
print datensatz;
idmax = id;
}
}

Gruss, Simon

hi!

kurz und bündig:

select id,spalte1,spalte2,datum
from tabelle t1
where t1.datum = (select max(datum) from tabelle t2 where t1.id=t2.id);

grüße,
tomh

Hallo Tomh,

Das funktioniert nicht!
Datum ist nicht eindeutig.

Tabelle könnte so aussehen:

id datum


1 01.01.2004
2 01.02.2004
3 01.01.2004

Eindeutig ist nur id + datum.

Gruss, Simon

Hallo Simon !

Hallo Alexander

Dann würde ich die Abfrage nach dem grössten Datum im Programm
machen.

Ja, werde ich wohl machen müssen, auch wenn das blöde ist, da ich denn wegen der 1000 benötigten Datensätze etliche 10000e abrufen muss.
Wahrscheinlich werde ich da regelmäßig die aktuellen Datensätze in eine 2. Tabelle kopieren und dann mit dieser Tabelle weiterarbeiten.

Alexander

hi!

Das funktioniert nicht!

es funktionert doch!

Datum ist nicht eindeutig.

stimmt! genau deswegen ist im sub-select ein t1.id = t2.id drinnen!!

ich hab mir ein test-tabelle mit mehreren sätzen gemacht (unique-key auf id + datum) und das select funktionert fehlerfrei und bringt mir genau die neuesten datensätze!

(ohne jetzt groß html zu formatieren)

tabelle test:

id spalte1 spalte2 datum
1 a b 01-Jän-04
1 c d 01-Feb-04
2 e f 01-Feb-04
2 g h 01-Mär-04
2 i j 01-Jän-04
3 k l 01-Jän-04
3 m n 01-Feb-04

das select liefert folgendes ergebnis:

id spalte1 spalte2 datum
2 g h 01-Mär-04
1 c d 01-Feb-04
3 m n 01-Feb-04

grüße,
tomh

STIMMT!!!

Du hast natürlich recht :wink:

Grüsse, Simon

Danke für die Antworten
Habe es jetzt doch im Programm abgefragt, da das mySQL noch eine 3er Version ist, die keine Subquerys kann…

Alexander

STIMMT!!!

Du hast natürlich recht :wink:

ich weiß, daß ich recht hab :wink:

obwohl - bei so „hingeworfenen“ statements schmeiß ich meistens einen ziemlich perversen fehler rein, deswegen hab ich’s extra nochmals ausprobiert :wink:

grüße,
tomh

Hallo!

ich hatte ein ähnliches Problem.
Die unten angeführte Lösung funktioniert.

Aber WARUM?
Kann mir jemand erklären, warum genau das funktioniert?

DANKE

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

hi!

Hallo!

ich hatte ein ähnliches Problem.
Die unten angeführte Lösung funktioniert.

Aber WARUM?
Kann mir jemand erklären, warum genau das funktioniert?

ist doch nur sql …

select id,spalte1,spalte2,datum

die felder, die ich wissen will

from tabelle t1

die tabelle

where t1.datum = (select max(datum) from tabelle t2 where

das datum wird mit dem maximalen datum derselben tabelle verglichen

t1.id=t2.id);

und zwar von jenen datensätzen, die dieselbe id haben

mit dem subselect bekomme ich das maximale datum für eine bestimmte id raus

so bekomme ich für jede id das maximale datum

für eine genauere erklärung empfiehlt es sich, ein bißchen sql zu schmökern bzw. jenen abschnitt zitieren, der unklar ist …

grüße,
tomh

Mir war der Subselect unklar,

Tut mir leid, hab nicht daran gedacht nur die eine Zeile zu erwähnen.

Ich weiß, dass das „nur“ sql ist, allerdings wäre ich nicht darauf gekommen (da ich auch keine Erfahrung habe), die tabelle einmal t1 und einmal t2 zu taufen, was ja anscheinend der Schlüssel zum Erfolg war.

Entschuldigt, wenn man euch Experten mit Anfängerfragen belästigt, allerdings werden wir sonst wohl niemals schlauer werden…

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

hi!

Mir war der Subselect unklar

gibt’s auch nicht überall

Ich weiß, dass das „nur“ sql ist, allerdings wäre ich nicht
darauf gekommen (da ich auch keine Erfahrung habe), die
tabelle einmal t1 und einmal t2 zu taufen, was ja anscheinend
der Schlüssel zum Erfolg war.

ansonsten gibt’s heftige troubles, wenn … id = id … verglichen wird

Entschuldigt, wenn man euch Experten mit Anfängerfragen
belästigt, allerdings werden wir sonst wohl niemals schlauer
werden…

„mein auto hat da was - was und warum?“

falls es irgendwie arrogant klang: sorry - aber wenn jemand nach dem „warum“ fragt, tippe ich, daß da sql-wissen dahinter liegt und deswegen auch irgendwie ein herumprobieren stattfindet (mach zumindest ich immer so, wenn ich eine lösung bekomme, die sich über 239 tabellen mit 823 sub-selects ziehnt - vielleicht ein bißchen übertrieben :wink:

ich wußte einfach nicht, muß ich das „select“ erklären oder das „exists“ oder überhaupt sql …

grüße,
tomh

ps: frag ruhig weiter - jedoch vielleicht etwas gezielter …