Michael Schröpl: Anzeige der zwei letzten DB Einträge

Beitrag lesen

Wenn Du im folgenden Statement [Tabelle] durch Deinen Tabellennamen, und [datum] durch eine Spalte, die die 'Neuheit' des Datensatzes angibt, ersetzt, dann ist es sogar egal, welche DB dahintersteht, und Du musst keine Schleife um alle gelieferten Datensätze legen.
Diese Abfrage liefert dir nur die beiden letzten.

Vorausgesetzt, in der Spalte "datum" sind nur eindeutige Werte vorhanden. Ansonsten kann die Abfrage beliebig viele Werte liefern.

Select * from [Tabelle]

»»  where [datum] = (Select max(datum) from [Tabelle])
»»  or [datum] = (Select max([datum]) from [Tabelle]

where [datum] < (Select max([datum]) from [Tabelle]))
Sollte es sich allerdings um große Datenmengen handeln, dann wird diese Abfrage allerdings Performanceprobleme haben (gerade bei langsamen DBs)

Dabei wird allerdings ziemlich viel doppelt berechnet.
(Trotzdem wird diese Abfrage - unabhängig von der Datenmenge - relativ schnell ablaufen, wenn über der "datum"-Spalte ein Index liegt, am besten natürlich ein UNIQUE INDEX.)

Einfacher wäre es,
      SELECT * from [Tabelle] ORDER BY [datum] DESC
abzufragen und aus dem zugehörigen Cursor nur die beiden ersten Einträge zu fetchen.
(Das ist möglicherweise sogar langsamer als die vorherige Lösung, weil vermutlich mit O(n*log(n)) sortiert werden muß.)

Die performanteste Lösung dürfte ein normaler full table scan (SELECT * FROM tabelle) mit eigener Maximum-Berechnung sein.
Arg viel Buchführung ist das ja nicht, jeden Wert mit zwei lokal gespeicherten Werten zu vergleichen und ggf. zu übernehmen:
  $max1 = kleiner_wert;
  $max2 = kleiner_wert;
  foreach $datum (@datumswerte)
          {
            if    ($datum > $max1) {$max2 = $max1; $max1 = $datum}
            elsif ($datum > $max2) {$max2 = $datum}
          }
und dazu natürlich jeweils die übrigen Tabellenfelder für die beiden Maximalwerte irgendwo abspeichern.
(Das sieht jetzt vielleicht vage aus wie Perl, soll aber keine konkrete Programmiersprache sein. ;-)