Может ли запрос MySQL помочь найти похожие записи клиентов?

64
7

У меня есть каталог компаний, предоставленных мне, которые они хотят хранить и обновлять в базе данных MySQL. Для каждой записи компании нет уникального идентификатора, такого как компания №1234.

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

Как я могу совместить сохраненную запись в db с новой, чтобы ее можно было обновить? В этой отрасли имя контакта может измениться и даже название компании, потому что они добавляют и вычитают партнеров. Их уличный адрес может измениться, потому что когда они перемещают бизнес, и они могут даже изменить свой номер телефона. У большинства компаний есть URL-адрес веб-сайта, поэтому, надеюсь, это не изменится часто, но это легко может.

Я видел в MySQL аналогичный матч%, будет ли это ответом на сопоставление записей с новой информацией?

Я работаю на PHP, если есть PHP-решение. Спасибо заранее доброй душе, которая помогает мне с этим!

спросил(а) 2021-01-19T17:36:11+03:00 6 месяцев, 1 неделя назад
1
Решение
78

Без первичного ключа это всегда сложно.

Однострочное решение, определите правила, которые наилучшим образом соответствуют вашим требованиям.

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

Правила могут быть простыми:

1. Available fileds:
contact name,
company name,
street address,
city,
state,
zip code,
phone number and
type of company (I Hope this is industry)
2. We will first match company name for similarity like
select * from table_name where company_name like '%$company_name%'
3. For all found records, match zip code and phone number. If match, break, record needs to be updated
4. If not match found in step 3, match street address. If match, break, record needs to be updated
5. & so on.

Ваш клиент - лучший человек, который может решить эти правила, поскольку он является владельцем продукта.

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

ответил(а) 2021-01-19T17:36:11+03:00 6 месяцев, 1 неделя назад
64

Поскольку вы сказали, что все поля таблицы могут измениться, я думаю, что нет простого способа правильно обновлять таблицу каждый раз, когда вы выбираете какой-либо алгоритм.
Один из способов добиться этого - попросить людей/систему (которая отправляет вам обновленные записи) также включить старые значения обновленных полей в файле csv. Если у вас есть старые значения, вы можете легко сопоставить их с текущими записями и обновить их новыми значениями.

ответил(а) 2021-01-19T17:36:11+03:00 6 месяцев, 1 неделя назад
45

Я пришел к аналогичному сценарию в одном из моих предыдущих проектов на сервере Sql. Я использовал следующие вещи, чтобы справиться с этим.

1. Обычно существует 2 типа files--

a) Полный канал (частота в неделю) будет содержать все компании из базы данных провайдеров. b) Инкрементная подача (Frequency Daily). У этого будут только новые записи, которые не находятся в полном фиде и обновлениях (вставки-I, обновления [CN00 ] как флаги в инкрементальных фидах)

2. Когда я получаю полный фид, я обновляю таблицу базы данных с полным каналом один раз в неделю. Также здесь у меня будут свои внутренние идентификаторы для каждой записи компании (эти идентификаторы предназначены для внутреннего использования)

3. Ежедневно я обрабатываю инкрементные фиды на основе флагов (I-insert, U -U pdate).

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

5. Для сравнения данных во избежание дублирования я использовал алгоритм Fuzzy для получения всех возможных совпадений, а затем использовал подстановочные знаки для фильтрации и определения новых и дубликатов.

ответил(а) 2021-01-19T17:36:11+03:00 6 месяцев, 1 неделя назад
46

Посмотрите на алгоритм расстояния Дамерау-Левенштейна. Он вычисляет "расстояние" между двумя строками и определяет, сколько шагов требуется для преобразования одной строки в другую. Чем меньше шагов, тем ближе две строки.

В этой статье представлен алгоритм, реализованный как хранимая функция MySQL. Вот версия PHP.

Алгоритм намного лучше, чем LIKE или SOUNDEX.

ответил(а) 2021-01-19T17:36:11+03:00 6 месяцев, 1 неделя назад
46

Это довольно общий вопрос, но само решение несколько уникально от проекта к проекту.

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

Этот алгоритм поможет вам найти те же записи, если они не имеют сразу всех основных изменений столбцов. Если они это сделают, нет никакого способа сказать это той же фирме программно.

Это свяжет строки с кажущимися теперь соединениями (строки 1 и 3 в примере)

Пример:

2001/01/01 Awesome firm, awesome.com
2002/02/02 Awesome firm, newaddress.com // linked with the first row over company name
2010/12/05 Ohsome inc, newaddress.com // linked over url

ответил(а) 2021-01-19T17:36:11+03:00 6 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема