Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于mysql中的最低id删除重复的电子邮件地址_Mysql_Sql_Phpmyadmin_Duplicate Removal - Fatal编程技术网

基于mysql中的最低id删除重复的电子邮件地址

基于mysql中的最低id删除重复的电子邮件地址,mysql,sql,phpmyadmin,duplicate-removal,Mysql,Sql,Phpmyadmin,Duplicate Removal,我有一个名为emaildata的表,包含4列emailaddress、domainname、data和id emailaddress列应该只包含唯一的条目,但有许多重复项。domainname和data列不是唯一的,因此将包含重复项,这很好。id列设置为autoincrement,因此仅包含唯一值 我的问题是如何去掉所有具有重复电子邮件地址的行,保留id最低的行 应该有大约370000行,但目前我有906000行 我有一个SQL语句,之前我用于一个类似的表,我尝试将其适应于此,但没有成功 del

我有一个名为emaildata的表,包含4列emailaddress、domainname、data和id

emailaddress列应该只包含唯一的条目,但有许多重复项。domainname和data列不是唯一的,因此将包含重复项,这很好。id列设置为autoincrement,因此仅包含唯一值

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

应该有大约370000行,但目前我有906000行

我有一个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的相同问题似乎崩溃了

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


任何信息都将不胜感激。

您的查询似乎是正确的。您的问题似乎是性能问题,而不是逻辑问题。你需要确保你的emailaddress和id字段在数据库中都被正确地索引了——否则,如果有将近一百万行,我希望你的查询会挂起

我猜这个id可能已经被索引了,但不是emailaddress。尤其是在表之间进行连接时,如果这些字段中的任何一个没有索引,您将看到大量的完整表扫描

编辑:

看到您的评论是这样的,您可以按照中的文档创建索引。比如:

CREATE INDEX email_index ON emaildata(emailaddress) USING BTREE;

从未尝试过查看数组\唯一的php函数是否修改过键,但这里是你可以做的

选择id和email并将它们存储在像id=>email这样的数组中

使用array_unique后,为每个重复组获取具有第一个id的新数组…这就是函数的工作方式。。。在合并2个数组并从您的表中删除剩余的ID之后


通过这种方式,您可以从重复组和唯一值中获取第一个id

这里称为myid的id在表结构的索引下具有以下内容。在任何内容上都没有其他索引,包括emailaddress。如何添加这些?myid BTREE是不是myid 899943我恐怕那个网站对我来说有点太复杂了。我尝试了你建议的陈述,但得到了以下结果。1146-表“emaildata.lookup”没有exist@RichardDownes-见我的最新答案。我在上一条评论中的CREATE INDEX语句中有一个输入错误。您的SQL查询已成功执行。现在尝试我的语句需要16.3626秒…Annnnnnd done。花了一段时间,但我的结果是376256,所以它看起来有效。感谢您的帮助:祝您新年愉快。请将数据库处理问题留在数据库中。不要跨层移动问题。试图以这种方式从数据库到应用层减少近一百万行,至少需要不适当的时间和RAM—如果不先让应用服务器陷入内存不足的情况。呵呵,你说得对。。。但是你不能总是保持数据库中的原始数据不变,所以有时候你不得不将数以百万计的行处理到app serv,以备将来处理。。。想象一下谷歌输出了数百万行……如果我在工作,请告诉我。。。在richard的案例中,是的,这不是最好的方法,但是junt是一个理想…还有一些人认为db例程过时了。。。他们在应用服务器中完成了大部分逻辑。。。我再次声明我的方法不适合理查兹的案子。。。