Я работаю с базой данных примерно с 100 тыс. Записей и хочу найти все похожие имена в этой базе данных, которые я поместил в один столбец. Сейчас я использую soundex, но результаты нечеткие, и фильтрация этих нечетких результатов в моем php делает процесс с таким количеством классов и записей soundex в базе данных очень медленным, поэтому я надеюсь, что есть другой способ отфильтровать лучшие совпадения, чем soundex .
Мой запрос:
SELECT soundex(full_name) AS soundex,
full_name AS customer_name
FROM (SELECT CONCAT(cu.first_name,' ', cu.last_name) AS full_name
FROM `customers` AS cu
WHERE cu.`status` = 1) a
ORDER BY soundex(full_name))
Поэтому я сравниваю все имена, которые я поместил в один столбец, и показываю их все, упорядоченные по soundex.
Есть ли способ эффективно использовать DIFFERENCE(soundex, soundex), кроме перекрестного объединения всей таблицы и сравнения каждого имени друг с другом? Или есть хороший способ достаточно разобрать не очень похожие имена?
@Sami Я использую таблицу MYSQL. Где мой код вас смущает? Так что я могу проверить, понятно ли это.
@EveEdomenko, поскольку вы использовали ссылку на документацию t-sql, может возникнуть путаница
Обратные тики делают его похожим на код MySQL.
@Barray спасибо за ваш комментарий. Я использую MySQL. Я также отредактировал сообщение и удалил ссылку на документацию t-sql и надеюсь, что мой вопрос яснее.
Возможно, вы захотите включить первичный ключ этой таблицы. Тогда можно хотя бы избежать совпадения имен с самими собой.
@LukStorms. Звучит неплохо для начала, но как первичный ключ позволяет избежать сопоставления всех имен друг с другом?
Идентификатор должен быть другим. F.e. ... FROM customer cu1 JOIN customer cu2 ON cu2.id <> cu1.id AND .... Не очень хорошо для производительности, потому что такие критерии в основном игнорируют индекс. Но вы поняли. Кстати, интересный старый SO пост здесь
Спасибо, добавлю дополнение с id. Я не знаю, что расстояние levensthein в этом случае полезно, так как необходимо провести много сравнений, но я буду держать вас в курсе, когда найду решение, вычисление которого может занять не вечность.






soundex для full_name может быть не лучшим способом нечеткого соответствия. Вы видели реализацию функции levenshtein. Если вы используете это, вы можете получить расстояние между двумя строками и использовать его для сортировки по лучшим совпадениям.
См. Следующий пример. Расстояние Левенштейна в T-SQL
Вы используете MySQL? Или SQL Server? ваш код меня немного смущает