lulu: MySQL - Ideen für kniffliges SELECT gesucht

Guten Morgen

gibt es für folgende Aufgabenstellung eine einfache MySQL Lösung?

Es soll in einem kleinen WCMS eine Liste der zuletzt bearbeiteten Datensätze angezeigt werden.

Bei jedem Speichern eines Datensatzes wird u.a. die entsprechende ID dieses Datensatzes, die ID der zugehörigen Tabelle und der Zeitstempel in einer Logtabelle gespeichert.

Diese sieht (vereinfacht) so aus:

id int(8), table_id int(8), record_id int(8), ts timestamp(14)

Die Daten sehen also z.B. so aus

id, table_id, record_id, ts

11, 1, 1, 20040419120000
12, 1, 1, 20040418120000
13, 2, 1, 20040419110000
14, 3, 1, 20040419140000
15, 1, 2, 20040419150000
16, 2, 1, 20040418110000

(11+12 sowie 13+16 bezeichenen jeweils den selben Datensatz nur zu unterschiedlichen Zeiten gespeichert)

Die Liste der Datensätze nach Zeitpunkt absteigend geordnet wäre also

15, 14, 11, 13, 12, 16

Die Liste der letzten Datensätze müsste also wie folgt aussehen

15, 14, 11, 13

(12 und 16 werden nicht aufgeführt, da keine Datensätze doppelt angezeigt werden sollen)

Soweit so einfach.

Versucht habe ich diverse Konstrukte mit DISTINCT, GROUP BY und HAVING, allerdings habe ich bisher keine Lösung hinbekommen.

Das im Artikel von Daniela http://aktuell.de.selfhtml.org/tippstricks/datenbanken/having/index.htm

geschilderte Problem/ Aufgabenstellung hört sich ähnlich an.
Ich konnte das aber bisher nicht an mein Problem anpassen.

Evtl. kommt das kniffelige daher, dass zur eindeutigen Identifizierung hier zwei Spalten herangezogen werden müssen (table_id und record_id).
Ich hatte da sogar schon daran gedacht per

concat(table_id,' ',record_id) AS dummy,

eine String als quasi-ID zusammenzubauen.
Abgesehen davon, dass das eine sehr hässliche Konstruktion ist, habe ich auch damit keine Lösung gefunden.

Danke für Eure Hilfe/ Tipps
und Viele Grüße

lulu

--
bythewaythewebsuxgoofflineandenjoytheday
  1. Hi Lulu

    gibt es für folgende Aufgabenstellung eine einfache MySQL Lösung?

    Ich glaube fast, dass ich eine gefunden habe. Ich bin mir jedoch nicht ganz sicher, ob sie deinen Ansprüchen genügt.

    Es soll in einem kleinen WCMS eine Liste der zuletzt bearbeiteten Datensätze angezeigt werden.

    Dazu bennötigst du die ID der Logtabelle nicht unbedingt, oder? Dann versuch es doch mal mit dem folgenden Query:

    SELECT table_id, record_id, MAX(ts) AS timestamp
    FROM logtable
    GROUP BY table_id, record_id
    ORDER BY timestamp;

    Die MAX-Funktion gibt dir der grössten Wert einer Gruppe aus. Das ist AFAIK das was du suchst, oder?

    FG & HTH

    Tom2

    --
    SELF-Code: (http://emmanuel.dammerer.at/selfcode.html)
    ss:| zu:) ls:& fo:) de:] va:) ch:] sh:( n4:& rl:° br:> js:| ie:% fl:( mo:}
  2. Hi Lulu

    Evtl. kommt das kniffelige daher, dass zur eindeutigen Identifizierung hier zwei Spalten herangezogen werden müssen (table_id und record_id).

    Das ist nicht das Problem. Falls man davon ausgehen kann, dass die Id der Logeinträge zunimmt (autoincrement Feld oder ähnliche Mechanismus), müsste sich das ganze so lösen lassen:

    Select max(id), table_id, record_id, max(ts)
      from tabelle
      group by table_id, record_id

    Das ganze funktioniert aber nur so, wenn jeweils der Datensatz mit dem neuesten Timestamp automatisch auch die höchste ID hat. Sonst kriegst du damit id und ts aus unterschiedlichen Datensätzen.

    Gruss Daniela

  3. Hi Daniela, hi Tom

    genau so etwas habe ich gesucht.

    Danke für Eure Hilfe

    lulu

    --
    bythewaythewebsuxgoofflineandenjoytheday