Lupus42: MySQL-Abfrage des jeweils neuesten Datensatzes

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

  1. 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

    1. Hallo,

      Versuch mal so:

      SELECT ID, Referenz, Wert, max(Bearbeitert) FROM Tabelle group by Referenz

      Auf Referenz muss ein Index liegen, glaube ich.

      1. 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

      2. 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

  2. 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

    --
    "Als es noch keine Computer gab, war das Programmieren noch relativ einfach." - Edsger W. Dijkstra
    1. Hallo,

      ups, da fehlt noch was: GROUP BY Referenz.

      Gruß,
      Leeloo

      --
      "Als es noch keine Computer gab, war das Programmieren noch relativ einfach." - Edsger W. Dijkstra
    2. 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

  3. 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: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

    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

  4. 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: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

    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

    1. 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

    2. 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

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau

      1. 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

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau