【问题标题】:Removing duplicate email address based on the lowest id in mysql根据mysql中的最低ID删除重复的电子邮件地址
【发布时间】:2012-01-30 14:47:21
【问题描述】:

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

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

任何信息将不胜感激。

【问题讨论】:

    标签: mysql sql phpmyadmin duplicate-removal


    【解决方案1】:

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

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

    编辑:

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

    CREATE INDEX email_index ON emaildata(emailaddress) USING BTREE;
    

    【讨论】:

    • id(这里称为myid)在表结构下的Indexs下有以下内容。任何东西都没有其他索引,包括电子邮件地址。如何,我要添加这些? myid BTREE 是 否 myid 899943 A
    • 恐怕那个网站对我来说有点太复杂了。我尝试了您建议的声明,但得到了以下内容。 #1146 - 表 'emaildata.lookup' 不存在
    • @RichardDownes - 查看我更新的答案。 (我在上一条评论中的 CREATE INDEX 声明中有错字。)
    • 成功了 您的 SQL 查询已成功执行(查询耗时 16.3626 秒)现在正在尝试我的语句...
    • Annnnnnd 完成了。花了一段时间,但我的结果是 376,256,所以它看起来有效。感谢您的帮助 :) 新年快乐。
    【解决方案2】:

    从未尝试查看 array_unique(php 函数)是否修改过密钥,但您可以这样做...

    选择 id 和 email 并将它们存储在一个数组中,例如 id => email

    在使用 array_unique 为每个 repetiteve 组获取一个具有第一个 id 的新数组之后......这就是函数的工作原理......并且在完成 2 个数组并从您的表中删除剩余的 id 之后......

    这样你就可以从重复组和唯一值中获取第一个 id

    【讨论】:

    • 请将数据库处理问题留在数据库中。不要跨层移动问题。尝试以这种方式将近百万行从数据库减少到应用程序层将至少需要过多的时间和 RAM - 如果不首先将应用程序服务器置于内存不足的情况。
    • 呵呵,对了……但你不能总是让数据库中的原始数据保持不变(所以有时你必须处理数百万行到应用程序服务以供将来处理).. . 想象一下谷歌输出了数百万行...如果我很累请告诉我...在理查德的情况下,是的,它不是最好的方法,但只是一个想法...
    • 还有一些人认为数据库例程已经过时......他们在应用程序服务器中完成大部分逻辑......我再次声明我的方法不适合理查兹案。 ..
    猜你喜欢
    • 1970-01-01
    • 2019-12-17
    • 2015-01-24
    • 1970-01-01
    • 2014-12-29
    • 2011-08-26
    • 1970-01-01
    • 2021-08-29
    • 2022-09-23
    相关资源
    最近更新 更多