mysql - 删除重复的行只留下最旧的行?

标签 mysql duplicate-removal delete-row

我有一个数据表,其中有许多来自用户提交的重复条目。

我想删除所有基于字段subscriberEmail 的重复行,只留下原始提交。

换句话说,我想搜索所有重复的电子邮件,并删除那些行,只留下原始的。

如何在不交换表的情况下执行此操作?
我的表格包含每一行的唯一 ID。

最佳答案

由于您使用 id 列作为哪个记录是“原始”的指示器:

delete x 
from myTable x
 join myTable z on x.subscriberEmail = z.subscriberEmail
where x.id > z.id

这将为每个电子邮件地址留下一条记录。

编辑添加:

解释上面的查询...

这里的想法是针对自身加入表格。假设您有该表的两个副本,每个副本的名称都不同。然后您可以将它们相互比较,并找到最低的 ID 或每个电子邮件地址。然后您会看到稍后创建的重复记录并可以删除它们。 (想到这个的时候我正在可视化 Excel。)

为了在表上执行该操作,将其与自身进行比较并能够识别每一侧,您可以使用表别名。 x是表别名。它在 from 中分配像这样的子句:from <table> <alias> . x现在可以在同一查询的其他地方使用,以作为快捷方式引用该表。

delete x以我们的行动和目标开始查询。我们将执行查询以从多个表中选择记录,并且我们要删除出现在 x 中的记录.

别名用于引用表的两个“实例”。 from myTable x join myTable z on x.subscriberEmail = z.subscriberEmail在电子邮件匹配的地方将 table 撞到自己身上。如果没有后面的 where 子句,每条记录都将被选中,因为它可以与自身相结合。

where子句限制选择的记录。 where x.id > z.id允许使用别名 x 的“实例”仅包含与电子邮件匹配但具有更高 id 的记录值(value)。您真正想要在表中的数据,唯一的电子邮件地址(具有最低 ID)将不会成为 x 的一部分。并且不会被删除。 x中的唯一记录将是具有更高 id 的重复记录(电子邮件地址)比该电子邮件地址的原始记录。

在这种情况下可以组合 join 和 where 子句:

delete x 
  from myTable x 
  join myTable z
    on x.subscriberEmail = z.subscriberEmail
      and x.id > z.id

为防止重复,请考虑将 subscriberEmail 列设为 UNIQUE 索引列。

关于mysql - 删除重复的行只留下最旧的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3671607/

相关文章:

MySQL 行为不正常

mysql - 如何在sql查询中识别客户和供应商

file - 通过计算每个文件的哈希值以外的技术在硬盘上查找重复文件

c++ - SQLite 在最后一次引用删除时删除共享行

php - undefined index html 选择

php - MySQL删除重复的反向值

c# - 删除列表中的重复对象 (C#)

excel - 如何解决excel-vba中的错误400

快速从 popUp 中删除 tableViewCell

MySQL:我可以为 1 列设置多个字符集吗?