sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo hago una coincidencia aproximada de nombres de empresas en MYSQL con PHP para autocompletar?

Puede comenzar usando SOUNDEX() , esto probablemente servirá para lo que necesita (me imagino un cuadro de sugerencias automáticas de alternativas ya existentes para lo que está escribiendo el usuario).

Los inconvenientes de SOUNDEX() son:

  • su incapacidad para diferenciar cadenas más largas. Solo se tienen en cuenta los primeros caracteres, las cadenas más largas que divergen al final generan el mismo valor SOUNDEX
  • el hecho de que la primera letra debe ser la misma o no encontrará una coincidencia fácilmente. SQL Server tiene la función DIFFERENCE() para decirle cuánto están separados dos valores de SOUNDEX, pero creo que MySQL no tiene nada de ese tipo integrado.
  • para MySQL, al menos según la documentos , SOUNDEX no funciona para la entrada Unicode

Ejemplo:

SELECT SOUNDEX('Microsoft')
SELECT SOUNDEX('Microsift')
SELECT SOUNDEX('Microsift Corporation')
SELECT SOUNDEX('Microsift Subsidary')

/* all of these return 'M262' */

Para necesidades más avanzadas, creo que debe consultar la distancia de Levenshtein (también llamado "editar distancia") de dos cadenas y trabajar con un umbral. Esta es la solución más compleja (=más lenta), pero permite una mayor flexibilidad.

El principal inconveniente es que necesita ambas cadenas para calcular la distancia entre ellas. Con SOUNDEX puede almacenar un SOUNDEX precalculado en su tabla y comparar/ordenar/agrupar/filtrar en él. Con la distancia de Levenshtein, es posible que encuentre que la diferencia entre "Microsoft" y "Nzcrosoft" es solo 2, pero llevará mucho más tiempo llegar a ese resultado.

En cualquier caso, se puede encontrar un ejemplo de función de distancia de Levenshtein para MySQL en codejanitor.com:Distancia de Levenshtein como función almacenada de MySQL (10 de febrero de 2007) .