【问题标题】:MySQL Multi Duplicate Record MergingMySQL多重复记录合并
【发布时间】:2011-10-26 04:21:04
【问题描述】:

以前的 DBA 管理一个包含 240 万个条目的非关系表,所有条目都具有唯一的 ID。但是,每条记录中都有不同数据的重复记录,例如:

+---------+---------+--------------+----------------------+-------------+
| id      | Name    | Address      | Phone   | Email      | LastVisited |
+---------+---------+--------------+---------+------------+-------------+
| 1       | bob     | 12 Some Road | 02456   |            |             | 
| 2       | bobby   |              | 02456   | bob@domain |             |
| 3       | bob     | 12 Some Rd   | 02456   |            | 2010-07-13  | 
| 4       | sir bob |              | 02456   |            |             |
| 5       | bob     | 12SomeRoad   | 02456   |            |             |
| 6       | mr bob  |              | 02456   |            |             |
| 7       | robert  |              | 02456   |            |             |
+---------+---------+--------------+---------+------------+-------------+

这不是确切的表格 - 真正的表格有 32 列 - 这只是为了说明

我知道如何识别重复项,在这种情况下,我使用的是电话号码。我已将重复项提取到一个单独的表中 - 总共有 730k 个整体。

合并这些记录(并将不需要的记录标记为删除)最有效的方法是什么?

我已经研究过将 UPDATE 与 INNER JOIN 结合使用,但需要几个 WHERE 子句,因为我想用后续记录中的数据更新第一条记录,其中后续记录具有前记录没有的附加数据。

我查看过第三方软件,例如 Fuzzy Dups,但如果可能的话,我想要一个纯 MySQL 选项

那么最终目标是我会得到类似的东西:

+---------+---------+--------------+----------------------+-------------+
| id      | Name    | Address      | Phone   | Email      | LastVisited |
+---------+---------+--------------+---------+------------+-------------+
| 1       | bob     | 12 Some Road | 02456   | bob@domain | 2010-07-13  | 
+---------+---------+--------------+---------+------------+-------------+

我应该查看存储过程/函数中的循环还是我错过了一些真正简单的事情?

【问题讨论】:

  • 你将不得不编写一个程序......但我想知道更多你想要什么,你想根据电话分组,但是如果在那个组中你有不同的姓名或地址等,那么你会喜欢哪个值????
  • 我想必须有一些稳定的工作点,所以如果我们只是说第一条记录应该是正确的记录。并非所有记录都如此,但我愿意冒险!

标签: mysql duplicate-removal


【解决方案1】:

你必须创建一个程序,但在此之前 创建你自己的 temp_table 像:

Insert into temp_table(column1, column2,....) values (select column1, column2... from myTable GROUP BY phoneNumber) 

你必须创建上面提到的物理表,以便你可以在上面运行游标。

创建过程 myPROC {

create a cursor on temp::
fetch the phoneNumber and id of the current row from the temp_table to the local variable(L_id, L_phoneNum).

在这里你也需要创建一个新的similar_tempTable,它将包含以下值

Insert into similar_tempTable(column1, column2,....) values (Select column1, column2,.... from myTable where phoneNumber=L_phoneNumber)

下一步是从similar_tempTable 中提取您想要的每一列的值,并更新到myTable 中id=L_id 的行,并从myTable 中删除其余重复行。

还有一件事,在每次游标迭代后截断similar_tempTable...

希望对你有所帮助...

【讨论】:

  • 所以如果我理解正确,我将光标放在临时表上并创建另一个临时表,然后将其截断。如果是这样,那么动态创建表会很慢吗?还是我误解了
  • 你已经完美了,它不会那么慢,只需在电话号码上放一个索引,然后考虑一下,这将是一个一次性的过程。所以你只需要担心一次
  • 只需要担心一次 - 确实如此。感谢您的帮助:)
  • @Rucia: 不用说谢谢,只是学习和分享,因为你的问题,我也学到了一些东西...:-)
猜你喜欢
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 2020-05-19
  • 2021-06-22
  • 2019-10-14
  • 2013-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多