我有一个问题,我似乎无法找到答案。我用 MySQL 驱动的 PHP 开发了一个非常小的类似 CRM 的应用程序。此应用程序的用户可以通过上传的 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 条记录。
提前致谢! 亚历克斯
最佳答案
如果我是你,我会给 name
、surname
和 phone number
一个 UNIQUE 键,因为理论上如果这三个都是等于则表示它是重复的。我这么想是因为一个电话号码只能有一个所有者。无论如何,您应该找到 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,则它会选择第二个表达式,在本例中是表中已存在的列值。因此,它将使用尽可能多的信息更新您的行。
关于php - MySQL 删除/合并相似的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8395586/