首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysql中基于最低id的邮件地址去重

问mysql中基于最低id的邮件地址去重
EN

Stack Overflow用户
提问于 2011-12-30 22:29:37
回答 2查看 2.2K关注 0票数 4

我有一个名为emaildata的表,由4列emailaddress、domainname、data和id组成。

emailaddress列应该只包含唯一的条目,但是有许多重复的条目。域名和数据列不是唯一的,因此将包含重复项,这很好。id列设置为自动增量,因此将仅包含唯一值。

我的问题是,如何删除所有具有重复电子邮件地址的行,保留id最低的行?

应该有大约370,000行,但目前我有906,000行。

我有一条SQL语句,在此之前,我曾将其用于类似的表,我曾尝试将其调整为适用于此表,但未获成功。

代码语言:javascript
复制
delete T1
from emaildata T1, emaildata T2
where T1.emailaddress = T2.emailaddress
and T1.id > T2.id

上面的内容基于下面的内容,并应用到另一个表中,运行良好。

代码语言:javascript
复制
delete T1
from email_list_subscribers T1, email_list_subscribers T2
where T1.emailaddress = T2.emailaddress
and T1.subscriberid > T2.subscriberid

我尝试在phpmyadmin的远程服务器上对我的表运行这个程序,按下GO按钮后,加载条出现在中间,然后消失,就像它正在处理一样-但它从来没有执行过。

我已经尝试通过phpmyadmin对运行在我的家庭服务器(XAMPP)上的同一个表重复此操作,并再次尝试使用HeidiSQL - phpmyadmin和Heidi似乎出现了相同的问题。

我已经尝试了其他我在这里看到的解决方案,但我似乎得到了相同的“超时”/崩溃问题。我从来没有遇到过在远程服务器上运行的原始语句的问题,尽管这是针对三分之一大小的数据库执行的。

任何信息都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-30 22:41:23

您的查询似乎是正确的。您的问题似乎是性能问题,而不是逻辑问题。您需要确保您的emailaddress和id字段在数据库中都有正确的索引-否则,对于接近一百万行的数据,我预计您的查询将挂起。

(我猜想id可能已经被索引了,但emailaddress还没有。特别是在进行表之间的连接时,如果这些字段中的任何一个字段没有索引,您将看到大量的全表扫描。)

编辑:

看到您的评论是这样的,您可以按照http://dev.mysql.com/doc/refman/5.0/en/create-index.html上的文档创建索引。所以就像这样:

代码语言:javascript
复制
CREATE INDEX email_index ON emaildata(emailaddress) USING BTREE;
票数 4
EN

Stack Overflow用户

发布于 2011-12-30 22:45:48

从未尝试过查看array_unique (php函数)是否会修改密钥,但以下是你可以如何做的……

选择id和电子邮件,并将它们存储在一个类似id =>电子邮件的数组中。

在使用array_unique为每个重复的group...thats函数获得第一个id的新数组之后,函数如何工作……在比较两个数组并从您的表中删除剩余的ids之后...

这样,您就可以从重复组和唯一值中获得第一个id

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8680477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档