sql >> Database >  >> RDS >> Mysql

Verwijder duplicaten op basis van twee kolommen en bewaar de rij met de minimale waarde van een andere kolom

U kunt deze zoekopdracht gebruiken om alle dubbele vermeldingen te verwijderen, zodat de vroegste behouden blijft:

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

Bijwerken

Een alternatieve oplossing die efficiënter zou moeten zijn voor echt grote tabellen, is om een ​​kopie te maken, met behulp van een UNIEKE index op de rijen om dubbele invoeging te voorkomen:

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;

De unieke sleutel zit in de combinatie van artiestennaam en tracknaam, zodat artiesten verschillende tracks kunnen hebben en verschillende artiesten dezelfde tracknaam. Omdat de SELECT een deel van de zoekopdracht heeft ORDER BY jaar, wordt de (artiest, track, jaar) combinatie met het laagste jaar eerst ingevoegd en daarna worden andere identieke (artiest, track) records niet ingevoegd vanwege de dubbele sleutel.

Demo op rextester




  1. Laravel Raw DB Betrokken rijen invoegen

  2. MySQL TEXT geheugentoewijzing

  3. Wat zijn de manieren om BLOB-gegevens in te voegen en op te halen uit de Oracle-database met behulp van SQL?

  4. Hoe kunt u records in de huidige maand laten maken?