MySQL Multi Duplicate Record Объединение - PullRequest
1 голос
/ 26 октября 2011

Предыдущий администратор баз данных управлял нереляционной таблицей с 2,4 млн записей, все с уникальными идентификаторами.Однако в каждой записи есть повторяющиеся записи с разными данными, например:

+---------+---------+--------------+----------------------+-------------+
| 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 столбца - это просто для иллюстрации

Я знаюкак идентифицировать дубликаты, в этом случае я использую номер телефона.Я извлек дубликаты в отдельную таблицу - всего 730 тыс. Записей.

Каков был бы наиболее эффективный способ объединения этих записей (и пометки ненужных записей для удаления)?

Я рассмотрел использование UPDATE с INNER JOIN, но необходимо несколько предложений WHERE, потому что я хочу обновить первую запись данными из последующих записей, где эта последующая запись содержит дополнительные данные, которые делает предыдущая записьнет.

Я смотрел на стороннее программное обеспечение, такое как Fuzzy Dups , но я хотел бы использовать опцию чистого MySQL, если это возможно

Конечная цель заключается в том, чтобыу меня осталось что-то вроде:

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

Должен ли я смотреть на циклы в хранимой процедуре / функции или есть какая-то очень простая вещь, которую я пропустил?

1 Ответ

1 голос
/ 26 октября 2011

Вам нужно создать ПРОЦЕДУРУ, но перед этим создайте свою собственную temp_table, например:

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

Вам нужно создать вышеупомянутую физическую таблицу, чтобы вы могли навести на нее курсор.

create 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).

И здесь вам также нужно создать новую аналогичную таблицу, которая будет содержать значения в виде

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

Следующим шагом является извлечение значенийкаждый столбец, который вы хотите получить от Similar_tempTable, и обновите его до строки myTable, где id = L_id, и удалите оставшиеся повторяющиеся строки из myTable.

И еще одна вещь - обрезать похожий_темплет после каждой итерации курсора ...

Надеюсь, это поможет тебе ...

...