Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Löschen Sie Duplikate basierend auf zwei Spalten und behalten Sie die Zeile bei, die den Mindestwert einer anderen Spalte hat

Sie können diese Abfrage verwenden, um alle doppelten Einträge zu löschen, wobei der früheste übrig bleibt:

DELETE d
FROM discog d
JOIN discog d1 ON d1.artist = d.artist AND d1.track = d.track AND d1.year < d.year;

Aktualisieren

Eine alternative Lösung, die für wirklich große Tabellen effizienter sein sollte, besteht darin, eine Kopie zu erstellen und einen UNIQUE-Index für die Zeilen zu verwenden, um doppeltes Einfügen zu verhindern:

CREATE TABLE discog_copy (id INT, artist VARCHAR(50), track VARCHAR(50), year INT);
ALTER TABLE discog_copy ADD UNIQUE KEY (artist, track);
INSERT IGNORE INTO discog_copy SELECT * FROM discog ORDER BY year;

Der eindeutige Schlüssel befindet sich auf der Kombination des Künstlernamens und des Titelnamens und ermöglicht so Künstlern, verschiedene Titel zu haben, und verschiedenen Künstlern, den gleichen Titelnamen zu haben. Da die SELECT Teil der Abfrage hat ORDER BY Jahr, wird zuerst die (Künstler, Titel, Jahr)-Kombination mit dem niedrigsten Jahr eingefügt und dann werden andere identische (Künstler, Titel) Datensätze aufgrund des doppelten Schlüssels nicht eingefügt.

Demo auf rextester