【问题标题】:MySQL Remove/Combine Similar RowsMySQL 删除/合并相似的行
【发布时间】:2012-01-13 19:11:36
【问题描述】:

我遇到了一个我似乎无法找到答案的问题。我在 PHP 中开发了一个非常小的类似 CRM 的应用程序,由 MySQL 驱动。此应用程序的用户可以通过上传的 CSV 文件将新数据导入数据库。我们现在正在努力解决的问题之一是重复的,或者更重要的是,接近重复的记录。例如,如果我有以下内容:

Record A: [1, Bob, Jones, Atlanta, GA, 30327, (404) 555-1234]

Record B: [2, Bobby, Jones, Atlanta, GA, 30327, Bob's Shoe Store, (404) 555-1234]

我需要一种方法来查看它们是否相似,获取包含更多信息的记录(在本例中为记录 B)并删除记录 A。

但这里变得更加复杂。这必须在导入新数据时完成,并且我可以执行一个函数来随时从数据库中删除重复项。我已经能够在 PHP 中将一些东西放在一起,从 MySQL 表中获取所有重复的行并通过电话号码匹配它们,或者通过在行中的所有列上使用 implode() 然后使用 strlen() 来确定最长的记录. 必须有一种更好的方法来做到这一点,而且更准确。

你们中的任何人有什么出色的建议可以让我实施或借鉴吗?很明显,当导入新数据时,我需要将他们的 CSV 文件打开到数组或临时 MySQL 表中,进行重复/类似搜索,然后重新编译 CSV 文件或将临时表中的所有内容添加到主表中。我想。 :)

我希望你们中的一些人能指出我可能遗漏的一些东西,这些东西可以适当地扩展,而且有些准确。我宁愿向一个有 5 条记录而不是 5,000 条记录的用户提供一份我们“不确定”的重复项列表。

提前致谢! 亚历克斯

【问题讨论】:

    标签: php mysql duplicates


    【解决方案1】:

    如果我是你,我会给namesurnamephone number 一个唯一键,因为理论上如果这三个都相等,则意味着它是重复的。我这么想是因为一个电话号码只能有一个所有者。无论如何,您应该找到 2-3 或 4 列的组合,并为它们分配一个唯一键。一旦你有了这样的结构,运行如下:

    // assuming that you have defined something like the following in your CREATE TABLE: 
    UNIQUE(phone, name, surname)
    // then you should perform something like:
    INSERT INTO your_table (phone, name, surname) VALUES ($val1, $val2, $val3) 
    ON DUPLICATE KEY UPDATE phone = IFNULL($val1, phone), 
                            name = IFNULL($val2, name),
                            surname = IFNULL($val3, surname);
    

    所以基本上,如果插入的值是重复的,则此代码将更新行,而不是插入新行。 IFNULL 函数执行检查以查看第一个表达式是否为空。如果它为空,那么它会选择第二个表达式,在这种情况下,它是表中已经存在的列值。因此,它将使用尽可能多的信息更新您的行。

    【讨论】:

      【解决方案2】:

      我认为没有出色的解决方案。您需要确定可用于检测相似性的数据字段的优先级,例如电话、某种 ID、某个统一地址或官方名称。 您可以保存一些清理过的值(简化为相同的格式,例如电话中的数字,连接的完整地址)以及添加记录时可以用于相似性搜索的行。 然后,您需要确定数据的完整性,以使用更完整的字段更新现有行,或者删除旧行并添加新行。

      不知道针对此类可变任务的任何现成解决方案,并怀疑它们是否存在。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-07
        • 2017-08-13
        相关资源
        最近更新 更多