SQL: neueste Einträge abfragen

Hallo,

ich bin auf der Suche für folgendes Problem mit diesen Tabellen (auf das wesentliche vereinfacht):
t1: a (Primärschlüssel, int), b (varchar)
t2: id (Primärschlüssel, int), a (int; hier nicht eindeutig), d (datetime), c (varchar)

Jetzt will ich für alle a aus t1, bei denen b einen bestimmten Wert hat, jeweils den neuesten Eintrag aus t2 (nach der Spalte d).

Mein Ansatz war
SELECT t1.a, t2.d, t2.c FROM t1 LEFT JOIN t2 ON t1.a=t2.a WHERE t1.b=„Wert“ AND ?
allerdings komme ich dort nicht weiter, da ich nicht weiss, wie ich den „neuesten“ Wert ausdrücke (der bei jedem Datensatz a anders ist).

Das Ganze ärgerlicherweise mit mySQL 4.0, also keine Subselects möglich, allerdings könnte man PHP-seitig ggfs. ein Ergebnis zwischenspeichern. Nur die verschachtelte Variante, also
SELECT a FROM t1 WHERE b=„Wert“
für jede Zeile SELECT d,c FROM t2 WHERE a=$a_von_außen ORDER BY d DESC LIMIT 1
will ich vermeiden.

Alexander

Hallo Alexander,

welches sind die neuesten Einträge? Woran erkennt man diese überhaupt? Ist t2.ID ein selbstnummerierendes Element oder erkennt man die letzten Einträge am Datum?

Unter MS SQL löse ich soetwas wie folgt:

* Annahme: je neuer der Eintrag, desto größer ist ID
Select t1.a, t2.ID from t1, t2
where b=‚Suchwert‘
and t1.a=t2.a
and t2.ID in (Select Max(ID) from T2 where t2.a=t1.a)

* Annahme: je neuer der Eintrag, desto jünger ist das Datum
Select t1.a, t2.ID from t1, t2
where b=‚Suchwert‘
and t1.a=t2.a
and t2.Datum in (Select Max(Datum) from T2 where t2.a=t1.a)

Viele Grüße
EP

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

Hi,

Also aus deinem Beitrag entnehme ich das Dir Sub Queries nicht möglich sind und einen Wert zwischenspeichern wäre möglich, aber nicht optimal.

Wie wäre es, wenn Du stattdessen einen Zwischentabelle erstellst und dabei nur die neuesten Werte berücksichtigst?

  • Schritt 1: Neueste Einträge aus T2 (über Datum?) herraussuchen und in eine temporäre Tabelle T2 derived speichern (Aufbau wie T2). dazu könntest Du die Sub Query aus dem anderen Beitrag nehmen.
  • Schritt 2: Join die T1 mit T2 derived.

Da ich nichts nähers zu deinen Tabellen weiss (Größe, Indizierung, Anzahl Zugriffe etc.) wäre das denke ich eine einfache Lösung.

Gruß

Sascha

Hallo Sascha,

Hi,

Also aus deinem Beitrag entnehme ich das Dir Sub Queries nicht
möglich sind und einen Wert zwischenspeichern wäre möglich,
aber nicht optimal.

Wie wäre es, wenn Du stattdessen einen Zwischentabelle
erstellst und dabei nur die neuesten Werte berücksichtigst?

Super Idee !!! Vielen Dank :wink: Auf die Idee mit der temp. Tabelle bin ich nicht gekommen :frowning:

CREATE TEMPORARY TABLE t3 (a int, maxd datetime);
INSERT INTO t3(a,maxd) SELECT t1.a, MAX(t2.d) FROM t1 JOIN t2 USING(a) WHERE t1.b=‚Wert‘ GROUP BY t1.a
SELECT t1.a, t2.d, t2.c FROM t1 LEFT JOIN t3 USING(a) LEFT JOIN t2 USING(a) WHERE t1.b=„Wert“ AND (t3.a IS NULL OR t3.maxd=t2.d)
DROP TABLE t3

Alexander