Mysql
 sql >> Database >  >> RDS >> Mysql

Elimina i duplicati in base a due colonne e mantieni la riga con il valore minimo di un'altra colonna

Puoi utilizzare questa query per eliminare tutte le voci duplicate, lasciando la prima:

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

Aggiorna

Una soluzione alternativa che dovrebbe essere più efficiente per tabelle molto grandi è creare una copia, utilizzando un indice UNICO sulle righe per evitare inserimenti duplicati:

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 chiave univoca si trova sulla combinazione del nome dell'artista e del nome del brano e quindi consentirà agli artisti di avere brani diversi e artisti diversi di avere lo stesso nome del brano. Perché il SELECT parte della query contiene ORDER BY anno, inserirà prima la combinazione (artista,brano,anno) con l'anno più basso e poi altri record identici (artista, brano) non verranno inseriti a causa della chiave duplicata.

Demo su rextester