mysql: datensatz anhand des timestamp finden
lars
- php
hallo zusammen,
ich habe folgendes problem:
ich habe eine tabelle mit folgendem grobem aufbau
1. id
2. name
3. info
4. timestamp
ich möchte nun zu jedem namen den letzten eintrag haben, sprich den mit dem jeweils höchsten timestamp.
SELECT name, info FROM infotabelle WHERE ???
aber was muss nun in den where teil?
hat jemand von euch eine idee?
mfg
lars
hallo zusammen,
ich habe folgendes problem:
ich habe eine tabelle mit folgendem grobem aufbau
- id
- name
- info
- timestamp
ich möchte nun zu jedem namen den letzten eintrag haben, sprich den mit dem jeweils höchsten timestamp.
SELECT name, info FROM infotabelle WHERE ???
aber was muss nun in den where teil?
hat jemand von euch eine idee?
mfg
lars
Hallo Lars,
nicht "where" ist dein statement, sondern "order by" :-).
Auf gut deutsch:
Mit "where" fragst du Datensätze mit einem bestimmten gesetzten Feldwert ab, mit "order by" kannst du Ergebnisse sortieren.
Wenn du das ganze jetzt noch mit "limit" einschränkst, kannst du dir immer den letzten (aktuellsten) Datensatz raussuchen lassen.
Gruss
Didi
Hallo Didi,
ich habe eine tabelle mit folgendem grobem aufbau
- id
- name
- info
- timestamp
ich möchte nun zu jedem namen den letzten eintrag haben, sprich den mit dem jeweils höchsten timestamp.
nicht "where" ist dein statement, sondern "order by" :-).
leider ist das falsch. WHERE ist genau richtig, ORDER BY hilft in diesem Fall überhaupt nicht.
Mit "where" fragst du Datensätze mit einem bestimmten gesetzten Feldwert ab, mit "order by" kannst du Ergebnisse sortieren.
Du sagst es ja selbst: Mit WHERE filtert man Datensätze - und das möchte der OP. Er möchte zu jedem Namen nur den Datensatz mit dem höchsten Timestamp.
Wenn du das ganze jetzt noch mit "limit" einschränkst, kannst du dir immer den letzten (aktuellsten) Datensatz raussuchen lassen.
Nein, das funktioniert nicht. Warum? Ganz einfach:
1. Möglichkeit:
Sortiere zuerst nach Namen, dann nach Timestamp. Du hast nun alle Einträge zu einem bestimmten Namen wunderbar beisammen. Wie willst Du mit LIMIT zu jedem einzelnen Namen genau einen Datensatz erhalten? Es geht einfach nicht.
2. Möglichkeit:
Sortiere erst nach Timestamp, dann nach Namen. Woher kennst Du die Anzahl der verschiedenen Namen? Kannst Du dir sicher sein, dass bei den höchsten Timestamps nicht ein Name doppelt auftaucht? nein, kannst Du nicht. Geht also auch nicht.
3. Möglichkeit:
Du könntest argumentieren: Aber da gibt es doch noch GROUP BY.
Das geht auch nicht, da Du über die Spalte info nicht sinnvoll gruppieren kannst. Da aber die Info aus der Spalte info essentiell ist, geht es nicht.
Wie es geht, habe ich in https://forum.selfhtml.org/?t=124769&m=804136 beschrieben.
Freundliche Grüße
Vinzenz
Hallo Lars,
ich habe eine tabelle mit folgendem grobem aufbau
- id
- name
- info
- timestamp
ich möchte nun zu jedem namen den letzten eintrag haben, sprich den mit dem jeweils höchsten timestamp.
wie bei MySQL üblich, ist die Lösung von Deiner MySQL-Version abhängig. Wenn Du MySQL 4.1.x verwendest, so ist diese Aufgabe einfach mit einem Subselect lösbar:
SELECT
name,
info
FROM tabelle t1 -- Vergabe Aliasnamen, da zweimal auf die gleiche
-- Tabelle zugegriffen wird
WHERE timestamp = ( -- Wähle den Eintrag mit
SELECT MAX(t2.timestamp) -- dem höchsten Timestamp aus
FROM tabelle t2 --
WHERE t1.name = t2.name -- zu jedem Namen
)
Bitte gib uns daher Deine MySQL-Version an.
Freundliche Grüße
Vinzenz
SELECT
name,
info
FROM tabelle t1 -- Vergabe Aliasnamen, da zweimal auf die gleiche
-- Tabelle zugegriffen wird
WHERE timestamp = ( -- Wähle den Eintrag mit
SELECT MAX(t2.timestamp) -- dem höchsten Timestamp aus
FROM tabelle t2 --
WHERE t1.name = t2.name -- zu jedem Namen
)
Vielen Dank für eure hinweise, ich nutze die 5er version, daher sind subqueries kein problem. ich hatte es schonmal damit versucht, aber der where teil im subquery war bei mir falsch ...
mfg
lars