RB.*_*. J 13 mysql duplicate-removal delete-row
我有一个数据表,并且有许多来自用户提交的重复条目.
我想根据字段删除所有重复行subscriberEmail
,只留下原始提交.
换句话说,我想搜索所有重复的电子邮件,并删除这些行,只留下原始邮件.
如何在不交换表的情况下执行此操作?
我的表包含每行的唯一ID.
Fos*_*sco 27
由于您使用id列作为哪个记录是"原始"的指示符:
delete x
from myTable x
join myTable z on x.subscriberEmail = z.subscriberEmail
where x.id > z.id
Run Code Online (Sandbox Code Playgroud)
这将为每个电子邮件地址留下一条记录.
编辑添加:
解释上面的查询......
这里的想法是加入桌子反对自己.假装你有两个表副本,每个副本都有不同的名称.然后,您可以将它们相互比较,并找到最低的ID或每个电子邮件地址.然后,您将看到稍后创建的重复记录,并可以将其删除.(当我想到这个时,我正在想象Excel.)
为了在表上执行该操作,将其与自身进行比较并能够识别每一侧,您使用表别名. x
是一个表别名.它在from
子句中分配如下:from <table> <alias>
. x
现在可以在同一查询中的其他位置使用该表作为快捷方式.
delete x
使用我们的操作和目标启动查询.我们将执行查询以从多个表中选择记录,并且我们想要删除出现的记录x
.
别名用于表示表的"实例". from myTable x join myTable z on x.subscriberEmail = z.subscriberEmail
在电子邮件匹配的地方碰到桌子.如果没有下面的where子句,则会选择每条记录,因为它可以与自身连接.
该where
子句限制所选的记录. where x.id > z.id
允许'实例'别名x
仅包含与电子邮件匹配但具有更高id
值的记录.表中您真正想要的数据,唯一的电子邮件地址(ID最低)x
将不会被删除,也不会被删除.唯一记录x
将是重复记录(电子邮件地址),其高于id
该电子邮件地址的原始记录.
在这种情况下,join和where子句可以组合在一起:
delete x
from myTable x
join myTable z
on x.subscriberEmail = z.subscriberEmail
and x.id > z.id
Run Code Online (Sandbox Code Playgroud)
为防止重复,请考虑将subscriberEmail列设置为UNIQUE索引列.
归档时间: |
|
查看次数: |
6789 次 |
最近记录: |