MySQL-Abfrage des jeweils neuesten Datensatzes
Lupus42
- datenbank
Hallo,
ich verzweifle ein wenig an einer Mysql-Abfrage.
Sie soll aus einer Tabelle Datensätze so auswählen, dass zu jeder Referenz (ist ein Feld in der Datenbank) nur einer übrig bleibt und zwar der neueste. Ein Beispiel:
Tabelle:
ID | Referenz | Wert | Bearbeitet
-----------------------------------------------
1 | 5 | Arthur | 17.03.2007 15:04:34
2 | 5 | Zaphod | 18.03.2007 16:12:45
3 | 5 | Ford | 20.03.2007 05:54:32
4 | 3 | Prosser | 17.03.2007 10:23:44
5 | 3 | Vogon | 19.03.2007 23:54:32
6 | 3 | Agrajag | 25.03.2007 17:13:12
7 | 4 | Marvin | 11.03.2007 11:45:55
8 | 4 | Tricia | 13.03.2007 02:24:35
Abfrage:
SELECT ID, Referenz, Wert, Bearbeitet FROM Tabelle xxxxx
Ergebnis:
ID | Referenz | Wert | Bearbeitet
-----------------------------------------------
3 | 5 | Ford | 20.03.2007 05:54:32
6 | 3 | Agrajag | 25.03.2007 17:13:12
8 | 4 | Tricia | 13.03.2007 02:24:35
Ich hoffe ihr könnt mir helfen, vielen Dank schon mal fürs Lesen :-)
Gruß, Lupus42
Hallo,
ID | Referenz | Wert | Bearbeitet
1 | 5 | Arthur | 17.03.2007 15:04:34
2 | 5 | Zaphod | 18.03.2007 16:12:45
3 | 5 | Ford | 20.03.2007 05:54:32
4 | 3 | Prosser | 17.03.2007 10:23:44
5 | 3 | Vogon | 19.03.2007 23:54:32
6 | 3 | Agrajag | 25.03.2007 17:13:12
7 | 4 | Marvin | 11.03.2007 11:45:55
8 | 4 | Tricia | 13.03.2007 02:24:35
Versuch mal so:
SELECT ID, Referenz, Wert. max(Bearbeitert) FROM Tabelle group by Referenz
LG
Paul
Hallo,
Versuch mal so:
SELECT ID, Referenz, Wert, max(Bearbeitert) FROM Tabelle group by Referenz
Auf Referenz muss ein Index liegen, glaube ich.
Hallo,
Versuch mal so:
SELECT ID, Referenz, Wert, max(Bearbeitert) FROM Tabelle group by Referenz
Auf Referenz muss ein Index liegen, glaube ich.
Ich habe es versucht, es liefert mir zwar zu jeder Referenz nur noch einen Datensatz und in der Spalte max(Bearbeitet) steht jeweils das neueste Datum, aber der Wert von "Wert" gehört nicht immer zu max(Bearbeitet).
Scheint so, als ob er zwar das Maximum von Bearbeitet bestimmt und ausgibt, aber für die anderen Werte (ID, Wert) irgendwelche nimmt. Ich hätte gerne, dass diese zu dem Maximum von Bearbeitet gehören.
Gruß, Lupus42
Hallo,
Versuch mal so:
SELECT ID, Referenz, Wert, max(Bearbeitert) FROM Tabelle group by Referenz
Auf Referenz muss ein Index liegen, glaube ich.
Ich vergaß mich für die Mühe zu bedanken, auch wenn es noch nicht ganz funktioniert!
Gruß, Lupus42
Hallo,
Kennst du ORDER BY ???
Damit kannst du deine Abfrage einfach erweitern: SELECT * FROM tabelle ORDER BY Bearbeitet DESC LIMIT 1;
Damit werden deine Einträge nach der Spalte Bearbeitet rückwärts sortiert. LIMIT 1 gibt dann den aktuellesten Wert zurück. Hilfreich wäre jedoch, wenn du das Datum nicht mit 20.03.2007 sondern mit 2007-03-20 speicherst. Ich glaub, dass klappt dann besser mit der Sortierung. Außerdem wäre das der Standarddatentyp DATE. DATETIME wäre dann 2007-03-20 12:34, wenn ich mich nicht irre.
Gruß,
Leeloo
Hallo,
ups, da fehlt noch was: GROUP BY Referenz.
Gruß,
Leeloo
Hallo,
Kennst du ORDER BY ???
Damit kannst du deine Abfrage einfach erweitern: SELECT * FROM tabelle ORDER BY Bearbeitet DESC LIMIT 1;Damit werden deine Einträge nach der Spalte Bearbeitet rückwärts sortiert. LIMIT 1 gibt dann den aktuellesten Wert zurück. Hilfreich wäre jedoch, wenn du das Datum nicht mit 20.03.2007 sondern mit 2007-03-20 speicherst. Ich glaub, dass klappt dann besser mit der Sortierung. Außerdem wäre das der Standarddatentyp DATE. DATETIME wäre dann 2007-03-20 12:34, wenn ich mich nicht irre.
Gruß,
Leeloo
Vielen Dank für die Idee! So bekomme ich den neuesten Datensatz. Ich hätte jedoch gerne von jeder Referenz den neuesten Datensatz.
Das Datum wird in meiner Datenbank im Format 2007-03-26 18:26:18 gespeichert, ich lasse es direkt von MySQL erstellen :-)
Gruß, Lupus42
Hallo,
Sie soll aus einer Tabelle Datensätze so auswählen, dass zu jeder Referenz (ist ein Feld in der Datenbank) nur einer übrig bleibt und zwar der neueste. Ein Beispiel:
Tabelle:
ID | Referenz | Wert | Bearbeitet
1 | 5 | Arthur | 17.03.2007 15:04:34
2 | 5 | Zaphod | 18.03.2007 16:12:45
3 | 5 | Ford | 20.03.2007 05:54:32
4 | 3 | Prosser | 17.03.2007 10:23:44
5 | 3 | Vogon | 19.03.2007 23:54:32
6 | 3 | Agrajag | 25.03.2007 17:13:12
7 | 4 | Marvin | 11.03.2007 11:45:55
8 | 4 | Tricia | 13.03.2007 02:24:35Abfrage:
SELECT ID, Referenz, Wert, Bearbeitet FROM Tabelle xxxxx
Ergebnis:
ID | Referenz | Wert | Bearbeitet
3 | 5 | Ford | 20.03.2007 05:54:32
6 | 3 | Agrajag | 25.03.2007 17:13:12
8 | 4 | Tricia | 13.03.2007 02:24:35
Die bisherigen Antworten sind leider beide falsch und haben auch einen völlig falschen Ansatz. Das Zauberwort für dieses Problem heisst </archiv/2006/7/t133015/#m861544title=korrelierte Unterabfrage>.
Du solltest meinen Archivbeitrag leicht auf Dein Problem anwenden können. Subselects unterstützt MySQL übrigens ab Version 4.1.
Freundliche Grüße
Vinzenz
Hallo Ingrid (that's me),
wenn man einmal auf die Vorschau verzichtet, jetzt mit richtigem Link :-)
Sie soll aus einer Tabelle Datensätze so auswählen, dass zu jeder Referenz (ist ein Feld in der Datenbank) nur einer übrig bleibt und zwar der neueste. Ein Beispiel:
Tabelle:
ID | Referenz | Wert | Bearbeitet
1 | 5 | Arthur | 17.03.2007 15:04:34
2 | 5 | Zaphod | 18.03.2007 16:12:45
3 | 5 | Ford | 20.03.2007 05:54:32
4 | 3 | Prosser | 17.03.2007 10:23:44
5 | 3 | Vogon | 19.03.2007 23:54:32
6 | 3 | Agrajag | 25.03.2007 17:13:12
7 | 4 | Marvin | 11.03.2007 11:45:55
8 | 4 | Tricia | 13.03.2007 02:24:35Abfrage:
SELECT ID, Referenz, Wert, Bearbeitet FROM Tabelle xxxxx
Ergebnis:
ID | Referenz | Wert | Bearbeitet
3 | 5 | Ford | 20.03.2007 05:54:32
6 | 3 | Agrajag | 25.03.2007 17:13:12
8 | 4 | Tricia | 13.03.2007 02:24:35
Die bisherigen Antworten sind leider beide falsch und haben auch einen völlig falschen Ansatz. Das Zauberwort für dieses Problem heisst korrelierte Unterabfrage.
Du solltest meinen Archivbeitrag leicht auf Dein Problem anwenden können. Subselects unterstützt MySQL übrigens ab Version 4.1.
Freundliche Grüße
Vinzenz
Du solltest meinen Archivbeitrag leicht auf Dein Problem anwenden können. Subselects unterstützt MySQL übrigens ab Version 4.1.
Vielen Dank, so werde ich es jetzt versuchen!
Gruß, Lupus42
Hello Vinzenz,
wie ist das denn mit der Verwendung von User-Variables?
Funktionieren die denn inzwischen?
Dann könnte man bei der Abrage doch einen Spaltenwert in einer User-Variable speichern und die Übernahme in das Resultset davon abhängig machen, dass sie sich von der bereits gespeicherten (aus dem letzten Datensatz) unterscheidet. So war das (in meiner Erinnerung zumindest) bei MySQL doch mal vorgesehen.
Hat aber nie funktioniert bei den mir bekannten Versionen.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hello Vinzenz,
wie ist das denn mit der Verwendung von User-Variables?
http://dev.mysql.com/doc/refman/5.0/en/user-variables.html
Entweder ich verstehe die Beschreibung immer noch falsch, oder aber es funktioniert eben anders, als beschrieben...
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom