196.删除重复的电子邮箱--leetcode

题目描述:

编写一个 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  |
+----+------------------+

算法设计与分析: 审清题目,是要删除重复的邮箱,最后运行验证才是select,所以这里应该使用delete。
方法一:我们其实可以使用嵌套

1、首先,按照email分组将表里面的信息查询出来

select  * from Person  group by  Email

得到的结果是:{"headers":["Id","Email"],"values":[[1,"john@example.com"],[2,"bob@example.com"],[3,"john@example.com"]]}

但是按照 *查询有效率问题,我们稍作更改:

select  min(Id) as Id,Email from Person  group by  Email

使用聚合函数min()选取最小的Id,作为Id,为后面做准备。

再次添加,将不再的最大的数据删除,剩下的就是想要的数据。

delete from 
    Person 
where 
    Id  # 将较大的Id删除
not in(
    select 
        Id 
    from 
    ( 
        select 
            min(Id) as Id,Email  # 排除Email相同的时候Id较大的行。
        from 
            Person 
        group by 
            Email
    ) as tmp  # 注意这里要取个别名,语法!
)

方法二:官方题解:使用deletewhere子句

1、将Person表与它自身在电子邮箱列中连接起来

SELECT p1.*
FROM Person p1,
    Person p2
WHERE
    p1.Email = p2.Email
;

然后需要找到其他记录中具有相同电子邮件地址的更大 ID。所以我们可以像这样给WHERE子句添加一个新的条件。

SELECT p1.*
FROM Person p1,
    Person p2
WHERE
    p1.Email = p2.Email AND p1.Id > p2.Id
;

因为我们已经得到了要删除的记录,所以我们最终可以将该语句更改为 DELETE

MySQL
DELETE p1 FROM Person p1,
    Person p2
WHERE
    p1.Email = p2.Email AND p1.Id > p2.Id
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值