Kopp: Doppelte Datensätze Löschen

Hallo,

Möchte, wenn möglich, mit nur einem DELETE befehl doppelte oder gar x-Fache Mysql-Datensätze löschen bzw. eben nur die überflüssigen Einträge.

[PSEUDO SQL]
DELETE UNIQUE name,str FROM tbl
[/PSEUDO SQL]

wobei $name und $str die Selects darstellen soll wonach eben gesucht werden soll, so dass $name und $str die Eindeutigen Spalten sind... ich glaube man versteht mich, oder?

Kopp

  1. echo $begrüßung;

    ich glaube man versteht mich, oder?

    Die Frage ist nur, was du an den zahlreichen Archiv-Threads zu dem Thema nicht verstanden hast, so dass man dir nun gezielt bei diesem Verständnisproblem helfen kann.

    echo "$verabschiedung $name";

    1. Die halfen mir eben nicht weiter!
      DISTINCT macht eigentlich genau das was ich will bis auf die tatsache das ich als Ergebnis auch nur die Spalte erhalte die ich eindeutig selektiert habe. Ich möchte jedoch eindeutig selektieren und alle spalten aufgelistet haben quasi

      SELECT DISTINCT firma SHOW ALL

      :-)

      1. yo,

        Ich möchte jedoch eindeutig selektieren und alle spalten aufgelistet haben

        verräst du uns auch noch den aufbau deiner tabelle mit beispieldaten, welche in der tabelle sind und welche du davon als "überflüssig" bezeichnen würdest ?

        Ilja

        1. yo,

          »» Ich möchte jedoch eindeutig selektieren und alle spalten aufgelistet haben

          verräst du uns auch noch den aufbau deiner tabelle mit beispieldaten, welche in der tabelle sind und welche du davon als "überflüssig" bezeichnen würdest ?

          ähm... okay: :-)

          id|firma|str|plz |ort |tel
          1 |abc  |1  |egal|egal|egal
          2 |abc  |1  |egal|egal|egal
          3 |xyz  |1  |egal|egal|egal
          4 |xyz  |2  |egal|egal|egal

          Die Abfrage soll dazu führen, dass die tabelle so aussieht

          1 |abc  |1  |egal|egal|egal
          3 |xyz  |1  |egal|egal|egal
          4 |xyz  |2  |egal|egal|egal

          Aber das sollte ja mit der Replace Technik gehen.. mal sehen..

          Kopp

          1. yo,

            Aber das sollte ja mit der Replace Technik gehen.. mal sehen..

            mit folgender abfrage bekommst du die gewünschte menge:

            SELECT t1.*
            FROM tabelle t1
            WHERE t1.id IN (SELECT MIN(t2.id)
                            FROM tabelle t2
                            GROUP BY t2.firma, t2.str
                           )
            ;

            Ilja

            1. Moin,

              mit folgender abfrage bekommst du die gewünschte menge:

              SELECT t1.*
              FROM tabelle t1
              WHERE t1.id IN (SELECT MIN(t2.id)
                              FROM tabelle t2
                              GROUP BY t2.firma, t2.str
                             )
              ;

              Bin doch ein wenig verwirrt bei der Abfrage.
              Könntest du diese kurz erläutern?
              Brauche ich dazu 2 Identische Tabellen? Oder eine Leere und eine Volle Datenbank? Was davon ist t1 und was t2? "tabelle t1" = "t1" also

              SELECT t1.*
              FROM t1
              WHERE t1.id IN (SELECT MIN(t2.id)
                              FROM t2
                              GROUP BY t2.firma, t2.str
                             )
              ;

              oder?

              Also bevor ich einfach irgendwas mach, frag ich doch lieber noch ma kurz nach :-)

              Kopp

              1. yo,

                Brauche ich dazu 2 Identische Tabellen? Oder eine Leere und eine Volle Datenbank? Was davon ist t1 und was t2? "tabelle t1" = "t1"

                du brauchst dafür nur die orginal-tabelle, t1 und t2 sind alias-namen weil in der abfrage die tabelle zweimal vor kommt und man sie unterscheiden muss.alles was du tun musst, ist meine abfrage nehmen und für den namen "tabelle" den richtigen namen deiner tabelle eintragen und die aliasbezeichnungen mit t1 nud t2 so belassen.

                Ilja

                1. Tolle Abfrage...
                  Hat mein Rechner zu 100% Ausgelastet für mehrere Minuten, bis ich ihn neu gestartet habe..
                  Die Replace-Technik war da 10 mal effektiver.
                  Außerdem zu was soll Deine Abfrage führen, da es ja nur ein SELECT ist?

                  Kopp

                  1. yo,

                    Außerdem zu was soll Deine Abfrage führen, da es ja nur ein SELECT ist?

                    sie zeigt dir die betroffenen datensätze an. ist eine vorgehensweise, die ich bei veränderungen oder löschungen bevorzuge, so dass man sich vorher noch mal einen überblick verschaffen kann. daraus ein entsprechendes delete zu machen ist sehr einfach.

                    Ilja

      2. Moin,

        Du kannst auch folgendermaßen vorgehen:

        • eine neue Tabelle "B" anlegen (Kopie von "A" aber nur Struktur)
        • einen oder mehrere UNIQUE Indizes in "B" anlegen
        • dann ein REPLACE INTO B SELECT * FROM A

        dann hast Du in "B" die um Duplikate bereinigten Daten.

        Viele Grüße

        Stefan

        --
        bythewaythewebsuxgoofflineandenjoytheday
        1. yo,

          • eine neue Tabelle "B" anlegen (Kopie von "A" aber nur Struktur)
          • einen oder mehrere UNIQUE Indizes in "B" anlegen
          • dann ein REPLACE INTO B SELECT * FROM A

          unwahrscheinlich, weil es innerhalb einer tabelle noch einen pk wert gibt, den man meistens behalten will.

          Ilja