Paco Calvari: Bei doppelten Einträgen den mit höchster id anzeigen

Hallo liebes Forum!
Ich sitze gerade an einem recht umfangreichen Formular, dessen werte in einer mysql-datenbank gespeichert werden und bei bedarf wieder verändert werden können sollen.
Mein Problem ist nun folgendes:
Wenn ich Daten aus der Datenbank auslese, ändere und wieder speichere, mache ich dies nicht mit dem update-statement, sondern mit insert, habe also jedesmal einen neuen Datensatz. Das ist auch gewollt, da ich auf diese weise eine Art Versionierung erhalte und die Veränderungen nachverfolgen kann.
Nun möchte ich aber auf einer Übersichtsseite bei den doppelten Einträgen jeweils den aktuellsten, also den mit der höchsten ID, anzeigen lassen.
Hab schon einiges probiert, aber GROUP BY und DISTINCT, auch in verbindung mit max(id) hab ich nicht hinbekommen.

SELECT * FROM tabelle GROUP BY kriterium ORDER BY id
würde reichen, aber dafür taugt ja leider GROUPBY nicht

wahrscheinlich brauch ich ein verschachteltes select, oder?
Erst nur eine tabellenspalte auslesen und da max(id) benutzen, dann die restdaten der Reihe selecten, oder so?
Bin noch nicht so wahnsinnig weit mit MySQL..

Vielen Dank schonmal!

  1. Hallo,

    Wenn ich Daten aus der Datenbank auslese, ändere und wieder speichere, mache ich dies nicht mit dem update-statement, sondern mit insert, habe also jedesmal einen neuen Datensatz. Das ist auch gewollt, da ich auf diese weise eine Art Versionierung erhalte und die Veränderungen nachverfolgen kann.

    das halte ich persönlich nicht für eine gute Idee. Nutze für so etwas lieber
    eine History-Tabelle.

    Nun möchte ich aber auf einer Übersichtsseite bei den doppelten Einträgen

    woran erkennst Du nun "doppelte Einträge". Für die _Id_entifikation von
    Datensätzen nutzt man üblicherweise ein Feld mit einem daran angelehnten Namen.

    jeweils den aktuellsten, also den mit der höchsten ID, anzeigen lassen.
    Hab schon einiges probiert, aber GROUP BY und DISTINCT, auch in verbindung mit max(id) hab ich nicht hinbekommen.
    wahrscheinlich brauch ich ein verschachteltes select, oder?

    Für dieses Standardproblem gibt es eine häufig gegebene Antwort. Löse diese
    Aufgabe mit einem korrelierten Subselect, siehe z.B. meine Ausführungen in
    diesem Archivposting.

    Ich rate Dir allerdings dazu, Dein Tabellendesign noch einmal zu überdenken.

    Freundliche Grüße

    Vinzenz

    1. Man geht das hier schnell, vielen Dank erstmal für die Antworten!
      Die Lösung von Alex ist bestechend einfach, aber bei eine Abfrage a la WHERE doppelfinder = doppelfinder, trifft doch einfach auf alle Datensätze zu, oder?

      Doppelte Einträge erkenne ich daran, dass es in jedem Datensatz mindestens ein Feld gibt, dessen Wert sich nicht ändert (in meinem Fall 'Sendung'), wohingegen andere Felder wie z. B Sendedatum geändert werden. In der Übersicht möchte ich dann die Datensätze z.B. nach Sendung sortiert anzeigen lassen und bei gleichen Werten im Feld Sendung halt jeweils den mit der höchsten ID. Ich weiß auch dass das so wie ich es mache wohl nicht die Königslösung ist, aber die Versionierung ist auch eher ein Nebenprodukt.
      Bin mittlerweile auch zu der Erkenntnis gelangt, dass das wohl (nur) mit subselects geht, aber da muss ich mich erstmal reinfummeln, außerdem weiß ich noch nicht ob es nachher mit mysql4.0 oder mysql4.1 laufen können muß und wenn ich das richtig verstanden habe, werden subselects erst ab 4.1 unterstützt, oder?
      Jetzt muß ich mich aber erstmal mit subselects und historytabellen auseinandersetzen
      Vielen Dank Alex und Vinzenz!

      1. Hallo

        Die Lösung von Alex ist bestechend einfach, aber bei eine Abfrage a la WHERE doppelfinder = doppelfinder, trifft doch einfach auf alle Datensätze zu, oder?

        sie ist falsch, es lohnt sich nicht weiter darüber nachzudenken.

        Doppelte Einträge erkenne ich daran, dass es in jedem Datensatz mindestens ein Feld gibt, dessen Wert sich nicht ändert (in meinem Fall 'Sendung'), wohingegen andere Felder wie z. B Sendedatum geändert werden.

        das hört sich danach an, als sei es nicht immer das gleiche Feld. Das ist noch
        schlechter :-( Eine einzelne Spalte, die in allen Fällen für zusammengehörige
        Datensätze identisch und auch eindeutig ist, ist Mindestanforderung.

        In der Übersicht möchte ich dann die Datensätze z.B. nach Sendung sortiert anzeigen lassen und bei gleichen Werten im Feld Sendung halt jeweils den mit der höchsten ID. Ich weiß auch dass das so wie ich es mache wohl nicht die Königslösung ist, aber die Versionierung ist auch eher ein Nebenprodukt.

        Bin mittlerweile auch zu der Erkenntnis gelangt, dass das wohl (nur) mit subselects geht, aber da muss ich mich erstmal reinfummeln, außerdem weiß ich noch nicht ob es nachher mit mysql4.0 oder mysql4.1 laufen können muß und wenn ich das richtig verstanden habe, werden subselects erst ab 4.1 unterstützt, oder?

        Das ist richtig, erst ab Version 4.1 unterstützt MySQL Subselects.
        Welche MySQL-Version hast Du im Einsatz? Handelt es sich um eine 5er-Version?
        Wenn ja, könntest Du die History-Funktion über einen Trigger realisieren.

        Freundliche Grüße

        Vinzenz

    2. Großartig!
      Hab dank lieber Vinzenz, funktioniert super. Jetzt muß ich nur noch beten, dass der Server wo das Ding drauf soll mysql4.1 kann..
      Ach ja, was kann denn bei der id-als-aktualitäts-merkmal-methode schiefgehen bzw, wo liegt der Vorteil einer Historytabelle?

  2. Hallo,

    ohne zu wissen wie genau du deine Doppelten findest, versuche ich jetzt mal dir zu helfen ;)

    Also nehmen wir an du findest die Doppelten weil bei denen jeweils das Feld "doppelfinder" gleich ist.

    SELECT * FROM tabelle WHERE doppelfinder = doppelfinder ORDER BY id DESC LIMIT 0,1

    Das müsste eigentlich so passen.
    doppelfinder = doppelfinder sucht alle einträge die in diesem Punkt gleich, also doppelt sind. Order BY id DESC sortiert die id's absteigend und LIMIT 0,1 lässt das Ding nach dem 1. Treffer aufhören.

    Ich habe das jetzt frei aus dem Kopf gemacht. Vor ein paar Monaten habe ich ne sehr komplexe Sache gebaut mit riesigen DB-Abfragen - habe da einiges gelernt....bin aber leider auch sehr vergesslich ;)

    mfg
    Alex