Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Excluir duplicatas com base em duas colunas e manter a linha que tem valor mínimo de outra coluna


Você pode usar esta consulta para excluir todas as entradas duplicadas, deixando a mais antiga:
DELETE d
FROM discog d
JOIN discog d1 ON d1.artist = d.artist AND d1.track = d.track AND d1.year < d.year;

Atualizar

Uma solução alternativa que deve ser mais eficiente para tabelas muito grandes é criar uma cópia, usando um índice UNIQUE nas linhas para evitar a inserção 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;

A chave exclusiva está na combinação do nome do artista e do nome da faixa, permitindo que artistas tenham faixas diferentes e artistas diferentes tenham o mesmo nome de faixa. Porque o SELECT parte da consulta tem ORDER BY ano, ele inserirá a combinação (artista, faixa, ano) com o ano mais baixo primeiro e, em seguida, outros registros idênticos (artista, faixa) não serão inseridos devido à chave duplicada.

Demonstração no rextester