我有一个数据表,并且用户提交的条目中有很多重复的条目。
我想根据字段删除所有重复的行subscriberEmail
,只留下原始提交。
换句话说,我想搜索所有重复的电子邮件,并删除那些行,只留下原来的。
我怎样才能做到这一点而不交换表?
我的表包含每一行的唯一 ID。
我有一个数据表,并且用户提交的条目中有很多重复的条目。
我想根据字段删除所有重复的行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
在电子邮件匹配的地方将桌子撞到自己身上。如果没有后面的 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
为了防止重复,请考虑将subscriberEmail 列设为唯一索引列。
怎么样,现在您不必使用自连接创建任何临时表
DELETE u1 FROM users u1, users u2 WHERE u1.id < u2.id AND u1.email = u2.email
检查表中是否有重复记录
SELECT count(*) as Count, email FROM users u group by email having Count > 1
如果每一行都有一个唯一的 id,你可以尝试这样的事情。不要问我为什么你需要第二个 select 语句,否则 mysql 不会让我执行。此外,按任何列分组,使您的结果独一无二。
delete from my_table where id in (
select id from (
select id from my_table a group by subscriberEmail having count(*) > 1
) b
);