toby: Mysql: Duplikate entfernen

moin.
wie kann ich (im nachhinein) alle duplikate, also wenn 2 datensätze bei einem bestimmten feld den selben wert haben, entfernen?
danke

  1. Hi,

    kommt darauf an, ist es (a) egal welcher der beiden Sätze überlebt und (b) unterscheiden sich die Sätze in einer bestimmten Spalte?
    Wenn ja, dann könnte man (Subselects vorausgesetzt), ein Delete absetzen, dass alle Datensätze löscht, die bei Gruppierung nach der "doppelten" Spalte zwei Vorkommen aufweisen. Das Problem ist nach der Gruppierung die unterschiedliche Spalte rauszuholen, bei Zahlen wäre es optimal, da könnte man MAX oder MIN verwenden, so a la
    DELETE FROM xyz
    WHERE unterschiedliches_zahlenfeld IN
        (
         SELECT MIN(unterschiedliches_zahlenfeld), gleiches_feld
         FROM xyz
         GROUP BY gleiches_feld
         HAVING COUNT(*) > 1
        )

    MfG
    Rouven

    --
    -------------------
    ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
    1. yo,

      DELETE FROM xyz
      WHERE unterschiedliches_zahlenfeld IN
          (
           SELECT MIN(unterschiedliches_zahlenfeld), gleiches_feld
           FROM xyz
           GROUP BY gleiches_feld
           HAVING COUNT(*) > 1
          )

      das ist eine hübsche falle, weil sich die DELETE bedingung nicht nach einer eindeutigen spalte (primary key) richtet. werte, die in der einen gruppierung durch den subselect ausgewählt werden, werden in den IN Operator mit aufgenommen und können somit auch bei allen anderen datensätze zu treffern führen, was sicherlich nicht gewollt ist. oder mit anderen worten, die zusammengehörigkeit in der unterabfrage durch das GROUP BY wird in der DELETE WHERE bedingung wieder aufgehoben.

      ich würde erst mal fragen, wie den die tabellenstruktur aussieht.

      Ilja

      1. Hallo,

        ich würde erst mal fragen, wie den die tabellenstruktur aussieht.

        ... und wieso diese nicht verhindert das überhaupt Duplikate angelegt werden können.

        Grüße
          Klaus