MySQL - Ideen für kniffliges SELECT gesucht
lulu
- datenbank
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
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
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
Hi Daniela, hi Tom
genau so etwas habe ich gesucht.
Danke für Eure Hilfe
lulu