我有一个包含近 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/