sql >> Base de Datos >  >> RDS >> Mysql

Elimine los duplicados en función de dos columnas y mantenga la fila que tiene el valor mínimo de otra columna

Puede usar esta consulta para eliminar todas las entradas duplicadas, dejando la primera:

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

Actualizar

Una solución alternativa que debería ser más eficiente para tablas realmente grandes es crear una copia, utilizando un índice ÚNICO en las filas para evitar la inserción duplicada:

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;

La clave única está en la combinación del nombre del artista y el nombre de la pista, por lo que permitirá que los artistas tengan diferentes pistas y diferentes artistas tengan el mismo nombre de pista. Porque el SELECT parte de la consulta tiene ORDER BY año, insertará la combinación (artista, pista, año) con el año más bajo primero y luego no se insertarán otros registros idénticos (artista, pista) debido a la clave duplicada.

Demostración en rextester