【发布时间】:2013-08-01 09:16:10
【问题描述】:
我正在开发一个 MYSQL 数据库,它包含以下三列:电子邮件、姓名、姓氏。
我需要做的是对我知道我可以使用这样一个功能的电子邮件进行重复数据删除(这个查询只是为了排序而不是删除):
select distinct emails, name, surname from emails;
或
select emails, name, surname from emails group by emails having count(*) >= 2;
但是,我还需要确保当发现重复的电子邮件地址时,保留的是具有姓名和/或姓氏值的电子邮件地址。
例如:
|标识 |电子邮件 |姓名 |姓氏 |
|1 | bob@bob.com |鲍勃 |保尔森 |
|2 | bob@bob.com | | |
在这种情况下,我想保留第一个结果并删除第二个结果。
我一直在研究使用“case”或“if”语句,但没有使用这些语句的经验。我尝试用这些语句扩展上述功能,但无济于事。
谁能指出我正确的方向?
PS:表中的第一列是一个自动递增的 id 值,以防万一
更新 1:到目前为止,@Bohemian 下面的答案效果很好,但在一种情况下失败了,其中有一个重复的电子邮件地址,其中一行有一个名字但没有姓氏,而在下一行它没有名字但有一个姓。它将保留这两个记录。需要编辑的只是删除这两条记录中的一条,不管是哪一条。
更新 2:@Bohemian 的答案很棒,但经过更多测试后,我发现它有一个根本缺陷,即它仅在名称和姓氏字段包含数据的重复电子邮件行(如第一个上表中的条目)。如果有重复的电子邮件,但没有一行填写姓名和姓氏字段,则所有这些行都将被忽略且不会重复数据删除。
此查询的最后一步是确定如何删除不满足当前必要条件的重复项。如果一行只有名字,而另一行只有姓氏,那么删除哪个并不重要,因为要保留电子邮件是很重要的。
【问题讨论】:
-
一行有名字,下一行有姓怎么办?
-
这是您要定期做的事情,还是一次性修复?
-
在这种情况下,我认为最好的解决方案是将两者连接起来,尽管我认为这会使事情复杂化很多。
-
这是一次性的,但可能每月使用一次以在数据库更新时清除数据库。
标签: mysql