SQL: erste Datensätze ab bestimmten Datum für alle id

Hallo liebe bplacer,
ich suche eine optimale(re) Lösung für folg. Problem, da ich etwas aus der Übung bin:

Ich habe eine Tabelle in der datum, refid, wert gespeichert werden.
Ich möchte nun eine Auswahl erzeugen, die für alle refid den Datensatz mit dem kleinsten Datum ab einer bestimmten Datumsgrenze zeigt. Klingt einfach, ist es aber nicht. Mein erster Ansatz:
Select * from tabelle t1 where datum =(SELECT MIN(datum) FROM tabelle t2 where datum > ‘.$datumgrenze.’ AND t1.refid = t2.refid);

Das mit dem subselect funktioniert, sieht aber furchbar kompliziert aus und ist sicher nicht optimal. Gibt es eine bessere/optimalere Lösung ?

LG Pit

Das ist doch einfach :ps:

SELECT t1.refid, t1.xyz FROM t1, t2 WHERE t2.datum > $datum AND t1.refid = t2.refid ORDER BY t1.datum DESC LIMIT 1;

Das ist ein implizierter JOIN, du kannst ihn auch ausschreiben wenn du willst. Performanceunterschiede sollte es da aber nicht geben.

:morgen:

Doch nicht so einfach :wink: . Ich hab mich entweder unpräzise ausgedrückt oder habe dein Ansatz noch nicht verstanden.
Ich brauche den ersten Wert nach dem Datum für jede vorhandene refid. Mein Ansatz bringt ein Ergebnis der Art:
datum refid wert
1.9.10 1 25
2.9.10 2 56
1.9.10 4 34

Ich habe dein SQL wie folgt umgesetzt:

SELECT * FROM tabelle t1, tabelle t2 WHERE t2.datumzeit > $datum AND t1.refid = t2.refid ORDER BY t1.datum DESC LIMIT 1;

Mit LIMIT 1 erhalte ich immer nur eine Zeile und dieser ist auch nicht der erste Wert nach dem Stichtag. :cry:

Ist ja auch richtig so. DESC sortiert absteigend und da mit einem Datensatz limitiert wird, wird eben nur der letzte Wert ausgegeben.

Nur das ich es so nicht brauche, sondern so wie oben beschrieben, die Datensätze für alle existierenden refid.

dev.mysql.com/doc/refman/5.1/en/ … p-row.html

Der Link führte mich zu einer Lösung, vielen Dank an Alle. Hier eine Alternative zur obigen Lösung:

SELECT t1.refid, t1.datum, t1.xyz  from tabelle t1
JOIN (SELECT id, MIN(datum) AS mdz  FROM tabelle WHERE datum > $datumgrenze GROUP BY refid) AS t2
  ON t1.refid = t2.refid AND t1.datum = t2.mdz;