Php MySQL删除/合并类似行

Php MySQL删除/合并类似行,php,mysql,duplicates,Php,Mysql,Duplicates,我有一个问题,我似乎找不到答案。我用PHP开发了一个非常小的类似CRM的应用程序,它由MySQL驱动。此应用程序的用户可以通过上载的CSV文件将新数据导入数据库。我们目前正在努力解决的问题之一是重复记录,或者更重要的是,接近重复记录。例如,如果我有以下内容: Record A: [1, Bob, Jones, Atlanta, GA, 30327, (404) 555-1234] 及 我需要一种方法来查看两者是否相似,获取包含更多信息的记录(在本例中为记录B)并删除记录a 但在这里,情况变得更

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

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

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

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

你们中有谁有什么好的建议我可以实施或借鉴吗?很明显,在导入新数据时,我需要将其CSV文件打开到数组或临时MySQL表中,执行重复/类似搜索,然后重新编译CSV文件或将所有内容从临时表添加到主表。我想……)

我希望你们中的一些人能指出一些我可能遗漏的东西,这些东西可以适当地进行缩放,并且有点准确。我宁愿向用户提供一份我们“不确定”的副本列表,长度为5条记录,而不是5000条

提前谢谢!
亚历克斯

我认为没有什么好办法。您需要确定可以用来检测相似性的数据字段的优先级,例如电话、某种ID、某种统一地址或官方名称。 您可以将一些清理后的值(简化为与电话中的数字相同的格式,连接完整地址)与行一起保存,以便在添加记录时用于相似性搜索。 然后,您需要决定在任何情况下数据的完整性,以使用更完整的字段更新现有行,或者删除旧行并添加新行


对于这样一个多变的任务,我不知道任何现成的解决方案,并且怀疑它们的存在

如果我是你,我会给
姓名
姓氏
电话号码
一个唯一的键,因为从理论上讲,如果这三者都相等,那么这就意味着它是重复的。我这么想是因为一个电话号码只能有一个所有者。无论如何,您应该找到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
函数执行检查以查看第一个表达式是否为null。如果为null,则选择第二个表达式,在本例中,该表达式是表中已经存在的列值。因此,它将用尽可能多的信息更新您的行

// 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);