我将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)
答案 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
年,因此它将首先插入具有最低年份的(艺术家,曲目,年份)组合,然后将不插入其他相同的(艺术家,曲目)记录由于密钥重复。