MySQL多重记录合并

时间:2011-10-26 04:21:05

标签: mysql duplicate-removal

以前的DBA管理了一个具有2.4M条目的非关系表,所有条目都具有唯一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子句,因为我想用后续记录中的数据更新第一个记录,其中后续记录具有前一记录所没有的附加数据。 / p>

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

最终目标是,我会留下类似的东西:

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

我应该看一下存储过程/函数的循环,还是我错过了一些非常简单的事情?

1 个答案:

答案 0 :(得分:1)

你必须创建一个PROCEDURE,但在此之前 创建你自己的temp_table,如:

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

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

创建PROCEDURE 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 ......

希望这会对你有所帮助......