MySQL删除/组合相似的行

时间:2011-12-06 05:07:52

标签: php mysql duplicates

我遇到了一个问题,我似乎无法找到答案。我在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条。

提前致谢! 亚历

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

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