删除基于两列的重复项,并保留具有另一列最小值的行

时间:2018-09-11 00:11:33

标签: mysql

我将discog的xml文件转换为MYSQL表,现在我面临着同一首歌的许多重复条目,而且发行年份不同,这是由于发行了“ best of”之类的歌曲而引起的。

我需要一个SQL查询,该查询将删除基于“艺术家”和“曲目”两列的行,但保留最早的“年份”。因此表如下所示:

id   | artist              | track                    | year
-----------------------------------------------------------------
1      Some Artist           Greatest Song Ever         1999
2      Some Artist           Greatest Song Ever         1985
3      Some Artist           Greatest Song Ever         2000

基本上,我想删除除带有'year'1985的一行以外的所有内容。

据我了解

ALTER IGNORE TABLE discog ADD UNIQUE (artist, track);

这曾经用来删除除一个以外的所有内容,但是我不相信IGNORE可与新版本的mysql一起使用。而且我不知道如何保留MIN(year)

1 个答案:

答案 0 :(得分:0)

您可以使用此查询删除所有重复的条目,并保留最早的条目:

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

更新

对于大型表,应该更有效的另一种解决方案是创建副本,在行上使用UNIQUE索引以防止重复插入:

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;

唯一键位于艺术家名称和曲目名称的组合上,因此它将允许艺术家具有不同的曲目,而不同的艺术家具有相同的曲目名称。由于查询的SELECT部分具有ORDER BY年,因此它将首先插入具有最低年份的(艺术家,曲目,年份)组合,然后将不插入其他相同的(艺术家,曲目)记录由于密钥重复。

Demo on rextester