MySQL nombre como '#% #% attributes.q' - no da lugar a cambio de una coincidencia exacta?
-
19-09-2019 - |
Pregunta
Tengo la siguiente consulta MySQL:
SELECT *
FROM customer
WHERE
fName LIKE '%#attributes.q#%' AND deleted = 'N'
OR
lName LIKE '%#attributes.q#%' AND deleted = 'N'
Esto funciona muy bien para conjeturas, pero si usted proporciona una coincidencia exacta: "Bill Clinton" fname = factura lname = Clinton a la consulta anterior se obtiene 0 resultados? donde cuenta Clint da resultados.
¿Cómo puede esta consulta se actualizará decir encontrar como resultado e igual a resultados?
Solución
Es difícil de decir de su pregunta, pero supongo que su tabla de clientes quedará del siguiente modo:
id fName lName deleted
---------------------------------
1 John Doe N
2 Bill Clinton N
3 Fred Smith N
4 George Bush Y
Su consulta, como usted ha declarado que en su pregunta, nunca funcionará, ya que se verá así:
SELECT *
FROM customer
WHERE fname LIKE '%Bill Clinton%' AND deleted = 'N'
OR
lName LIKE '%Bill Clinton%' AND deleted = 'N'
No hay registros en la tabla donde los campos FName O lname contienen "Bill Clinton"
Usted tendría que dar masajes a su # # attributes.q texto por lo que va a generar algo como esto:
SELECT *
FROM customer
WHERE ((fName LIKE '%Bill%') OR (fName LIKE '%Clinton%')) AND deleted = 'N'
OR
((lName LIKE '%Bill%') etc.....
COMO comparaciones son muy similares utilizando comodines en los nombres de archivo. No van a dividir un bloque de texto para usted, pero le dirá si existe un trozo de texto, palabra por palabra, dentro de otro trozo de texto.
Creo que lo que necesita es un búsqueda de texto completo , que tendrá en cuenta las palabras individuales en una cadena de consulta y devolver resultados. Por supuesto, FULLTEXT sólo está disponible en los tipos de tabla MyISAM, por lo que si usted está utilizando InnoDB o algún otro tipo, estás de suerte.
Otros consejos
FYI - Índices de texto sólo se pueden utilizar con tablas InnoDB o MyISAM, y se pueden crear sólo para CHAR, VARCHAR o columnas TEXT
.