php - MySQL 删除/合并相似的行

标签 php mysql duplicates

我有一个问题,我似乎无法找到答案。我用 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 条记录。

提前致谢! 亚历克斯

最佳答案

如果我是你,我会给 namesurnamephone 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/

相关文章:

phpMyAdmin 通过 http 登录

php - 如何计算joomla中sql查询的行数并显示出来?

php - MySQL - 根据值选择列

在 TeSTLink 安装中找不到 MySql

duplicates - XmlPad 与 XPath 查找重复节点的问题

PHP:为什么我得到 "Undefined property: myCar::$model"

php - 使用 SQL 转储将 500MB .db 文件导入 phpmyadmin

javascript - 在数组中搜索字符串的最佳方法

sql - GAE 数据存储大量数据

c++ - 从 char 数组中删除重复的单词(仅在后面)