para - MySQL: ¿Qué es una versión inversa de LIKE?
mysql workbench community 6.3 10 winx32 msi (3)
Aquí hay una manera de lograr lo que describes:
SELECT name FROM user
WHERE ''John Smith and Peter Johnson are best friends'' LIKE
CONCAT(''%'', name, ''%'')
El operador LIKE en MySql se utiliza para buscar filas que contengan nuestro texto de consulta, por ejemplo:
select name from user where name like "%john%"
que devolverá a John Smith
, Peter Johnson
etc.
¿Qué sucede si necesito lo contrario para encontrar filas que están CONTENIDAS en nuestro texto de consulta? Por ejemplo, le doy John Smith and Peter Johnson are best friends
y quieren que encuentre todos los nombres de la tabla que se pueden encontrar en esta cadena.
¿Como hacer eso?
Este es un problema de indexación de texto. Si lo hago bien, su tarea es encontrar todas las referencias a personas en un texto de forma libre, y no tiene nada que ver con LIKE o NOT LIKE.
En una forma general, la tabla de la base de datos con la que busca referencias actúa como diccionario de algún algoritmo de indexación de texto. Construya un índice en la cadena de entrada usando este diccionario y con suerte obtendrá algunas coincidencias.
select name
from users
where instr(''John Smith and Peter Johnson'', name) > 0
Prefiero usar este método en lugar de:
select *
from users
WHERE ''John Smith and Peter Johnson'' LIKE CONCAT(''%'', name ,''%'')
porque si existe la posibilidad de que el name
contenga el carácter %
o _
(por ejemplo, name = ''v% alue''), la consulta anterior aún devolverá ese registro incorrectamente. También tenga en cuenta que si su columna puede contener barras diagonales inversas y / o " C caracteres de escape ", también deberían escaparse. Todo esto se explica en MySQL String Comparison Functions . Por ejemplo, el siguiente SQL devolvería 1:
SELECT ''val/%ue'' LIKE CONCAT(''%'', ''al/////%u'' ,''%'');
La barra invertida única debe escaparse con ////
y se ha escapado el carácter %
: /%
.