477 Stimmen

Alle doppelten Zeilen außer einer in MySQL löschen?

Wie kann ich alle doppelten Daten aus einer MySQL-Tabelle löschen?

Zum Beispiel mit den folgenden Daten:

SELECT * FROM names;

+----+--------+
| id | name   |
+----+--------+
| 1  | google |
| 2  | yahoo  |
| 3  | msn    |
| 4  | google |
| 5  | google |
| 6  | yahoo  |
+----+--------+

Ich würde verwenden SELECT DISTINCT name FROM names; wenn es ein SELECT Abfrage.

Wie würde ich das machen mit DELETE nur Duplikate zu entfernen und nur einen Datensatz von jedem zu behalten?

43 Stimmen

29 Stimmen

Es handelt sich nicht um eine exakte Frage nach Duplikaten, da hier speziell nach einem DELETE-Befehl gefragt wird, der dieselbe Aktion ausführt, die ein ALTER-Befehl, der einen eindeutigen Index hinzufügt, benötigen würde, damit MySQL automatisch doppelte Zeilen entfernt. In diesem Fall wählen wir aus, wie genau wir die Duplikate löschen wollen.

1 Stimmen

Eine Frage über Duplikate hat also Duplikate? Hmm

1035voto

martin.masa Punkte 10262

Warnung des Herausgebers: Diese Lösung ist rechnerisch ineffizient und kann Ihre Verbindung bei einer großen Tabelle zum Erliegen bringen.

NB - Sie necesito dies zunächst auf einer Testexemplar Ihres Tisches!

Dabei habe ich festgestellt, dass ich nur dann etwas tun kann, wenn ich auch AND n1.id <> n2.id wird jede Zeile der Tabelle gelöscht.

  1. Wenn Sie die Zeile mit dem niedrigsten Wert behalten wollen id Wert:

    DELETE n1 FROM names n1, names n2 WHERE n1.id > n2.id AND n1.name = n2.name
  2. Wenn Sie die Zeile mit dem höchsten Wert behalten wollen id Wert:

    DELETE n1 FROM names n1, names n2 WHERE n1.id < n2.id AND n1.name = n2.name

Ich habe diese Methode in MySQL 5.1 verwendet

Bei anderen Versionen bin ich mir nicht sicher.


Update: Da Leute, die nach dem Entfernen von Duplikaten googeln, hier landen
Obwohl sich die Frage des Auftraggebers auf DELETE Bitte beachten Sie, dass die Verwendung von INSERT y DISTINCT ist viel schneller. Bei einer Datenbank mit 8 Millionen Zeilen dauerte die folgende Abfrage 13 Minuten, während die DELETE Es dauerte mehr als 2 Stunden und wurde dennoch nicht abgeschlossen.

INSERT INTO tempTableName(cellId,attributeId,entityRowId,value)
    SELECT DISTINCT cellId,attributeId,entityRowId,value
    FROM tableName;

88 Stimmen

Ausgezeichnete Lösung. Sie hat perfekt funktioniert. Aber ich habe einen Vorschlag, wir sollten die Bedingungen austauschen. Anstelle von [WHERE n1.id > n2.id AND n1.name = n2.name] sollten wir [WHERE n1.name = n2.name AND n1.id > n2.id] schreiben, um die Leistung zu verbessern, wenn wir so viele Daten haben.

12 Stimmen

Zu Ihrer Information: Zeilen, in denen die Spalte "Name" Null ist, werden ignoriert.

3 Stimmen

sqlfiddle.com/#!2/e5df9 für ein Schema-Beispiel. Möglicherweise müssen Sie Ihre Instanz von MySQL laden. Dann ausführen: SELECT * FROM deldup; DELETE n1 FROM deldup n1, deldup n2 WHERE n1.or_id < n2.or_id AND n1.order_id = n2.order_id AND n1.txt_value = n2.txt_value AND n1.date_of_revision = n2.date_of_revision AND n1.status = n2.status; SELECT * FROM deldup;

247voto

OMG Ponies Punkte 312816

Wenn Sie die Zeile mit dem niedrigsten Wert behalten wollen id Wert:

DELETE FROM NAMES
 WHERE id NOT IN (SELECT * 
                    FROM (SELECT MIN(n.id)
                            FROM NAMES n
                        GROUP BY n.name) x)

Wenn Sie die id Wert, der am höchsten ist:

DELETE FROM NAMES
 WHERE id NOT IN (SELECT * 
                    FROM (SELECT MAX(n.id)
                            FROM NAMES n
                        GROUP BY n.name) x)

Die Subquery in einer Subquery ist für MySQL notwendig, sonst erhalten Sie eine Fehlermeldung 1093.

9 Stimmen

Welche Funktion hat das "x"?

10 Stimmen

@GDmac es dient als Alias für die innere Abfrage. Wenn nicht angegeben, wird ein Fehler ausgegeben.

3 Stimmen

Dies ist eine viel bessere Lösung. Die von masa-255 funktioniert nicht. Wofür ist das x?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X