删除/合并类似的行


MySQL Remove/Combine Similar Rows

我有一个问题,我似乎找不到答案。我用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表中获得所有重复的行,并通过电话号码匹配它们,或者通过使用内爆()对行中的所有列,然后使用strlen()来决定最长的记录。肯定有更好的方法来做这件事,而且更准确。

你们中有谁有什么好的建议,我可以实施或建立?很明显,当导入新数据时,我需要将CSV文件打开到一个数组或临时MySQL表中,进行重复/类似搜索,然后重新编译CSV文件或将临时表中的所有内容添加到主表中。我认为。:)

我希望你们中的一些人能指出一些我可能遗漏的东西,这些东西可以适当地缩放,并且是准确的。我宁愿向用户展示一个我们不确定的副本列表,长度为5条,而不是5000条。

提前感谢!亚历克斯

如果我是你,我会给name, surnamephone 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函数执行检查以查看第一个表达式是否为空。如果它为空,则选择第二个表达式,在本例中是表中已经存在的列值。因此,它将用尽可能多的信息更新您的行。

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

不知道任何现成的解决方案,这样一个多变的任务,怀疑他们是否存在。