MySQL удалить / объединить похожие строки - PullRequest
3 голосов
/ 06 декабря 2011

У меня есть проблема, на которую я просто не могу найти ответ. Я разработал очень маленькое CRM-подобное приложение на PHP, управляемое MySQL. Пользователи этого приложения могут импортировать новые данные в базу данных через загруженный файл 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 записей, а не 5000.

Заранее спасибо! Alex

Ответы [ 2 ]

2 голосов
/ 06 декабря 2011

На вашем месте я бы дал УНИКАЛЬНЫЙ ключ для name, surname и phone number, так как в теории, если все эти три равны, это означает, что это дубликат.Я так думаю, потому что у номера телефона может быть только один владелец.В любом случае, вы должны найти комбинацию из 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, оно выбирает второе выражение, которое в данном случае является значением столбца, которое уже существует в вашей таблице.Следовательно, он обновит ваш ряд с максимально возможным количеством информации.

0 голосов
/ 06 декабря 2011

Я не думаю, что есть блестящие решения.Вам необходимо определить приоритет ваших полей данных, на которые вы можете положиться при обнаружении сходства, например, телефон, какой-либо идентификатор, какой-либо унифицированный адрес или официальное имя.Вы можете сохранить некоторые очищенные значения (сокращенные до того же формата, что и цифры в телефонах, полный адрес), а также строку, которую вы сможете использовать для поиска сходства при добавлении записей.Затем вам нужно в любом случае принять решение о полноте данных, чтобы обновить существующие строки с более полными полями, или удалить старые и добавить новую строку.

Не знаю готовых решений для такой переменной задачи и сомневаюсь, что они существуют,

...