thardy: Anfängerproblem GROUP BY

Hallo,
ich bin ein totaler SQL-Neuling/Stumpfkopf und scheitere an einem sehr einfachen Problem, bitte nicht lachen.
Es geht um folgende Tabelle:

Tabelle obst:
name   | preis | timestamp

Apfel  | 45.00 | 1262731719
Birne  | 94.96 | 1262731719
Orange | 19.95 | 1262731719
Kiwi   | 15.50 | 1262731719
Kiwi   | 14.50 | 1262732578
Birne  | 94.98 | 1262733058
Kiwi   | 15.50 | 1262767427
Kiwi   | 14.50 | 1262768481

Ich möchte als Ergebnis zu jedem Obst den aktuellsten Preis haben, also die Zeile, mit der größten Timestamp.
Versucht habe ich ganz laienhaft einfach folgendes:

SELECT name, preis, MAX( ts )
FROM obst
GROUP BY name

Dann erhalte ich zwar die neuesten Timestamps, der Preis passt aber nicht dazu, die Kiwi dürfte mit dieser Timestamp ja nur 14,50 kosten:

Apfel  | 45.00 | 1262731719
Birne  | 94.96 | 1262733058
Kiwi   | 15.50 | 1262768481
Orange | 19.95 | 1262731719

Wie macht man sowas?
Ich nutze übrigens MySQL 5, falls das von Bedeutung ist.

Danke fürs Lesen!

Gruß
Thomas

  1. Dann erhalte ich zwar die neuesten Timestamps,

    Was reiner Zufall ist.

    der Preis passt aber nicht dazu,

    Was reiner Zufall ist.

    Wie macht man sowas?

    Mit Sortierung, wie willst du sonst zum neusten timestamp kommen?

    1. Dann erhalte ich zwar die neuesten Timestamps,

      Was reiner Zufall ist.

      Das glaub ich nicht, Tim.

      Mit Sortierung, wie willst du sonst zum neusten timestamp kommen?

      Mit MAX(ts)?

      1. Dann erhalte ich zwar die neuesten Timestamps,

        Was reiner Zufall ist.

        Das glaub ich nicht, Tim.

        Eine Datenbank ist kein Stapel karierter Hemden bei der man das oberste Hemd bekommen, wenn man zugreift. Ach ja, und ich hatte das MAX übersehen.

  2. Hallo,

    du benötigst MAX in einer korrelierenden Unterabfrage um dein Problem auf eine mögliche Weise zu lösen, GROUP BY Name, MAX(timestamp) und einen JOIN um es auf eine andere mögliche Weise zu lösen.

    Gib mir Name, Preis und Timestamp wo Timestamp gleich dem maximalen Timestamp je Name ist ...

    SELECT DISTINCT t1.*
       FROM tabelle AS t1
       WHERE timestamp = (SELECT MAX(t2.timestamp)
                                           FROM tabelle AS t2
                                           WHERE t2.Name = t1.Name)

    Cheers, Frank

    1. Das ist es, vielen Dank!

      Gruß
      Thomas

    2. du benötigst MAX in einer korrelierenden Unterabfrage ...

      Gib mir Name, Preis und Timestamp wo Timestamp gleich dem maximalen Timestamp je Name ist ...

      SELECT DISTINCT t1.*
         FROM tabelle AS t1
         WHERE timestamp = (SELECT MAX(t2.timestamp)
                                             FROM tabelle AS t2
                                             WHERE t2.Name = t1.Name)

      Danke für die Antwort auf die Frage eine ich hier mal gestellt habe aber auf die niemand geantwortet hat.

      1. Wortstapel verbuchselt.

      2. muss ich wohl damals übersehen haben ... und sonst antworten ja Ilja, dedlfix auch immer auf solche Fragen

        btw: natürlich geht es auch mit SELECT TOP 1 ... ORDER BY ... in der korrellierenden Unterabfrage. Könnte ja nach Implementierung von Tabellen, Indizes und natürlich je nach Datenbanksystem Unterschiede hinsichtlich Performance machen.

        Cheers, Frank