从 table 中删除部分重复的行

Deleting partially duplicate rows from a table

我们有一个具有以下架构的 table:

+--------+------------------+------+-----+---------+----------------+
| Field  | Type             | Null | Key | Default | Extra          |
+--------+------------------+------+-----+---------+----------------+
| id     | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| name   | varchar(128)     | YES  |     | NULL    |                |
| label  | varchar(10)      | NO   |     | NULL    |                |
| f1     | varchar(8)       | YES  |     | NULL    |                |
| f2     | varchar(6)       | YES  |     | NULL    |                |
+--------+------------------+------+-----+---------+----------------+

我们希望将名称标签对不明显的所有行视为重复行(即忽略 f1 和 f2)。在这种情况下,我们希望通过仅保留具有最高 id 的行来删除重复行(顺便说一句,稍后会在 table 中输入,因此假定它是最新的)。

在 MySQL 5.6.51 中实现它的最有效方法是什么?

JOIN 本身并删除较小的行 id

DELETE a
FROM duplicates a
JOIN duplicates b ON a.label = b.label AND a.name = b.name
WHERE a.id < b.id

name 可能是 NULL,如果 NULL 被认为是重复的:

DELETE a
FROM duplicates a
JOIN duplicates b ON a.label = b.label AND COALESCE(a.name, '') = COALESCE(b.name, '')
WHERE a.id < b.id