57 - 删除重复的电子邮箱

题目

编写一个 SQL 查询,来删除 Person 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个。

+----+------------------+ | Id | Email | +----+------------------+ | 1 | john@example.com | | 2 | bob@example.com | | 3 | john@example.com | +----+------------------+

Id 是这个表的主键。 例如,在运行你的查询语句之后,上面的 Person 表应返回以下几行:

+----+------------------+ | Id | Email | +----+------------------+ | 1 | john@example.com | | 2 | bob@example.com | +----+------------------+

解答

delete a from 
person as a, person as b 
where 
a.email = b.email and a.id > b.id

Runtime: 850 ms, faster than 33.94% of MySQL online submissions forDelete Duplicate Emails.

Memory Usage: N/A

最初是这样的:

select a.* from person as a, person as b where a.email = b.email
  • 从两张表中间选,就相当于在两张表的行的排列组合当中,选出想要的内容

  • 筛选条件是email相等,因此如果select * from ...,那么就会得到去掉2的排列组合两张表

image-20190820204455131

因此这里写select a.* from ...,意思是从表a里面选中所有,所以结果是

image-20190820204611741

也就是左边的这张表

再从中筛选出a.id > b.id的结果,也就是a中id为3的选项。把它删掉即可。

  • 那为啥是delete a from ...,而不是delete from ...

image-20190820205531065

报错了

估计是从两张表中删除内容,mysql就不知道该删除哪张了。

如果是从一张表中删除,那么默认删除的就是这张表,delete 后面就不需要再指定是哪张表了,直接delete from 即可。

Last updated

Was this helpful?