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

edqdpe6u  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(251)

我把discog的xml文件转换成了mysql表,现在我面临着同一首歌在不同的发行年份有很多重复的条目,这是因为像“best of”这样的发行版。
我需要一个sql查询,将删除两列'artist'和'track'为基础的行,但保留最早的'year'。。所以这张table看起来是这样的:

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);

这是用来删除所有,但一个,但我不相信忽略工程与mysql的新版本。我不知道如何保持最小(年)

2vuwiymt

2vuwiymt1#

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

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

更新
对于非常大的表,另一种更有效的解决方案是创建一个副本,使用行上的唯一索引来防止重复插入:

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 年,它将首先插入具有最低年份的(艺术家、曲目、年份)组合,然后由于重复键,将不会插入其他相同的(艺术家、曲目)记录。
rextester上的演示

相关问题