Mysql - 根据条件删除重复行的sql查询

标签 mysql sql

我有一个包含近 100 万条记录的数据库表 - 当我编写查询以查看其中有多少重复时 - 有近 90K 条重复记录 - 重复是指具有相同电子邮件地址的记录 - 比如一个电子邮件地址 - 可能有 10 条记录。

示例数据

ID | Name | Email            | phone
 1 | abc  | abc@gmail.com    | 12345
 2 | def  | def@gmail.com    | 12533
 3 | abc  | abc@gmail.com    | 
 4 | hij  | hij@gmail.com    | 50633   
 5 | abc  | abc@gmail.com    | 12345
 6 | def  | def@gmail.com    | 

1) ID为表的自增主键

2) 如果有两条记录,如 def@gmail.com - 我需要保留有电话的记录并删除另一条记录

3) 现在 abc@gmail.com 的情况 - 有 3 条记录 - 没有电话的记录被删除 - 现在剩下的两条 - 尽管两者都有所有数据 - 保留第一个并删除第二个

是否可以根据条件编写删除语句,或者是否有更简单的方法来完成此操作。

可玩的 SQLfiddle - http://sqlfiddle.com/#!2/cf8c7

非常感谢

最佳答案

DELETE FROM phoney ph
WHERE ph.zphone IS NULL
AND EXISTS (SELECT *
        FROM phoney ex
        WHERE ex.zname = ph.zname
        AND ex.zemail = ph.zemail
        AND ex.zphone IS NOT NULL
        );

DELETE FROM phoney ph
WHERE ph.zphone IS NOT NULL
AND EXISTS (SELECT *
        FROM phoney ex
        WHERE ex.zname = ph.zname
        AND ex.zemail = ph.zemail
        AND ex.id < ph.id
        );

SELECT * FROM phoney;

结果:

DELETE 2
DELETE 1
 id | zname |    zemail     | zphone 
----+-------+---------------+--------
  1 | abc   | abc@gmail.com | 12345
  2 | def   | def@gmail.com | 12533
  4 | hij   | hij@gmail.com | 50633

注意:您可以组合这两个删除查询,但这会导致 WHERE 子句中的 AND/OR 条件困惑,这是非常错误-容易发生。

关于Mysql - 根据条件删除重复行的sql查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11835439/

相关文章:

sql - 如何通过 EntLib 5.0 将表值参数传递给 SQL Server 2008?

mysql - mysql 子查询中字段名称区分大小写(版本 5.6 与版本 8)

php - 使用 pdo 插入 cookie 值

sql - 必须声明变量标量

sql - 优化按日期搜索的非常常用的查询

php - 从 MySQL 数据库中的列表中删除项目

mysql - 将信息拉取到未绑定(bind)字段

php - While 循环和提醒表

mysql - 选择列 MYSQL 中的所有不同单词

mysql - 无法使用包含空值的 where 来选择 select 语句中的列