У меня интересная проблема, и моя логика не соответствует задаче.
У нас есть таблица, в которой иногда появляются повторяющиеся записи (по технологическим причинам, и это неизбежно). Возьмем следующий пример:
id FirstName LastName PhoneNumber email
-- --------- -------- ------------ --------------
1 John Doe 123-555-1234 [email protected]
2 Jane Smith 123-555-1111 [email protected]
3 John Doe 123-555-4321 [email protected]
4 Bob Jones 123-555-5555 [email protected]
5 John Doe 123-555-0000 [email protected]
6 Mike Roberts 123-555-9999 [email protected]
7 John Doe 123-555-1717 [email protected]
Мы находим дубликаты таким образом:
SELECT c1.*
FROM `clients` c1
INNER JOIN (
SELECT `FirstName`, `LastName`, COUNT(*)
FROM `clients`
GROUP BY `FirstName`, `LastName`
HAVING COUNT(*) > 1
) AS c2
ON c1.`FirstName` = c2.`FirstName`
AND c1.`LastName` = c2.`LastName`
Это генерирует следующий список дубликатов:
id FirstName LastName PhoneNumber email
-- --------- -------- ------------ --------------
1 John Doe 123-555-1234 [email protected]
3 John Doe 123-555-4321 [email protected]
5 John Doe 123-555-0000 [email protected]
7 John Doe 123-555-1717 [email protected]
Как видите, на основе FirstName
и LastName
все записи дублируются.
На этом этапе мы фактически звоним клиенту, чтобы устранить возможные дубликаты.
После этого мы узнаем (например), что записи 1 и 3 — настоящие дубликаты, а записи 5 и 7 — на самом деле совершенно два разных человека.
Таким образом, мы объединяем любые внешне связанные данные из записей 1 и 3 в запись 1, удаляем запись 3 и оставляем записи 5 и 7 в покое.
Теперь возникает проблема:
В следующий раз, когда мы повторно запустим запрос «дубликаты», он будет содержать следующие строки:
id FirstName LastName PhoneNumber email
-- --------- -------- ------------ --------------
1 John Doe 123-555-4321 [email protected]
5 John Doe 123-555-0000 [email protected]
7 John Doe 123-555-1717 [email protected]
Все они кажутся дубликатами, хотя мы ранее признали, что это не так.
Как бы вы определили, что эти записи не являются дубликатами?
Сначала я создал таблицу поиска, определяющую, какие записи не являются дубликатами друг друга (например, {1,5}, {1,7}, {5,7}), но я понятия не имею, как построить запрос, который сможет использовать эти данные.
Кроме того, если появится другая повторяющаяся запись, это может быть дубликат 1, 5 или 7, поэтому нам нужно, чтобы они все отображались в списке дубликатов, чтобы сотрудник службы поддержки мог позвонить человеку в новой записи, чтобы выяснить, какой записи он может быть дубликатом.
Я натянут до предела, пытаясь понять это. Есть ли блестящие гении, которые хотели бы попробовать это?