196. 删除重复的电子邮箱

1.题目描述

表: Person
±------------±--------+
| Column Name | Type |
±------------±--------+
| id | int |
| email | varchar |
±------------±--------+
id是该表的主键列。
该表的每一行包含一封电子邮件。电子邮件将不包含大写字母。

编写一个 SQL 删除语句来 删除 所有重复的电子邮件,只保留一个id最小的唯一电子邮件。以 任意顺序 返回结果表。 (注意: 仅需要写删除语句,将自动对剩余结果进行查询)

查询结果格式如下所示。
示例 1:
输入:
Person 表:
±—±-----------------+
| id | email |
±—±-----------------+
| 1 | [email protected] |
| 2 | [email protected] |
| 3 | [email protected] |
±—±-----------------+
输出:
±—±-----------------+
| id | email |
±—±-----------------+
| 1 | [email protected] |
| 2 | [email protected] |
±—±-----------------+
解释: [email protected]重复两次。我们保留最小的Id = 1。

2.解题思路

本题的解题思路是,先查出需要删除的数据,也就是Email字段相同,而id大的那一行数据。
需要先进行查出:删除数据
SELECT p1.* FROM employee p1 join employee p2 on p1.name = p2.name and p1.id > p2.id
然后进行使用 delete 进行删除上面条件的数据
补充知识:

  • 1.最基础的条件删除,如下所示
    DELETE FROM table_name where table_name.name=‘dell’
    还有一种按序删除的方式如下 DELETE FROM customers ORDER BY Name LIMIT 10
  • 2.MySQL DELETE语句使用INNER/left/right JOIN子句
    DELETE a FROM tablename AS a LEFT JOIN temp_name AS b ON a.ID = b.ID WHERE b.UserID > 0;
    DELETE a FROM tablename AS a LEFT JOIN temp_name AS b ON a.ID = b.ID WHERE b.ID IS not null;

本题使用的是方式2,进行解题的

3.代码

DELETE p1 FROM Person p1,
    Person p2
WHERE
    p1.Email = p2.Email AND p1.Id > p2.Id

你可能感兴趣的:(LeetCode数据库,mysql,数据库,sql)