我有一个名为emaildata的表,由4列emailaddress、domainname、data和id组成。
emailaddress列应该只包含唯一的条目,但是有许多重复的条目。域名和数据列不是唯一的,因此将包含重复项,这很好。id列设置为自动增量,因此将仅包含唯一值。
我的问题是,如何删除所有具有重复电子邮件地址的行,保留id最低的行?
应该有大约370,000行,但目前我有906,000行。
我有一条SQL语句,在此之前,我曾将其用于类似的表,我曾尝试将其调整为适用于此表,但未获成功。
delete T1
from emaildata T1, emaildata T2
where T1.emailaddress = T2.emailaddress
and T1.id > T2.id上面的内容基于下面的内容,并应用到另一个表中,运行良好。
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似乎出现了相同的问题。
我已经尝试了其他我在这里看到的解决方案,但我似乎得到了相同的“超时”/崩溃问题。我从来没有遇到过在远程服务器上运行的原始语句的问题,尽管这是针对三分之一大小的数据库执行的。
任何信息都将不胜感激。
发布于 2011-12-30 22:41:23
您的查询似乎是正确的。您的问题似乎是性能问题,而不是逻辑问题。您需要确保您的emailaddress和id字段在数据库中都有正确的索引-否则,对于接近一百万行的数据,我预计您的查询将挂起。
(我猜想id可能已经被索引了,但emailaddress还没有。特别是在进行表之间的连接时,如果这些字段中的任何一个字段没有索引,您将看到大量的全表扫描。)
编辑:
看到您的评论是这样的,您可以按照http://dev.mysql.com/doc/refman/5.0/en/create-index.html上的文档创建索引。所以就像这样:
CREATE INDEX email_index ON emaildata(emailaddress) USING BTREE;发布于 2011-12-30 22:45:48
从未尝试过查看array_unique (php函数)是否会修改密钥,但以下是你可以如何做的……
选择id和电子邮件,并将它们存储在一个类似id =>电子邮件的数组中。
在使用array_unique为每个重复的group...thats函数获得第一个id的新数组之后,函数如何工作……在比较两个数组并从您的表中删除剩余的ids之后...
这样,您就可以从重复组和唯一值中获得第一个id
https://stackoverflow.com/questions/8680477
复制相似问题