2012-06-19 22 views
13

Siempre pensé que podría usar OR en una declaración LIKE para consultar cosas en MySQL. Por lo tanto, si quería comparar varios campos en una fila para 1 palabra clave o expresión:Usando OR en LIKE Query en MySQL para comparar múltiples campos

SELECT * FROM MyTable WHERE Column1 OR Column2 LIKE '%keyword%'; 

y si tuviera una matriz de palabras para comparar:

SELECT * FROM MyTable WHERE Column1 OR Column2 LIKE '%keyword1%' 
AND Column1 OR Column2 LIKE '%keyword2%'; 

No creo que la sintaxis es correcto, sin embargo. ¿Hay algún método eficiente para escribir esto aparte de algo como:

SELECT * FROM MyTable WHERE Column1 LIKE '%keyword1%' OR Column2 LIKE 
'%keyword1%' AND Column1 LIKE '%keyword2%' OR Column2 LIKE '%keyword2%'; 

¿Voy a hacerlo correctamente?

+0

Me pregunto acerca de su algoritmo de "matriz de palabras" de todos modos ... ¿Está seguro de que desea recuperar resultados si una columna es como una palabra Y si una columna es como otra? Me parece bastante ineficiente – Sebas

+0

puede usar procedimientos también. – vijay

+0

La (s) palabra (s) clave provienen de un campo de búsqueda, por lo que los usuarios querrán buscar en una base de datos basada en muchos campos. Si usan 2 palabras en su término de búsqueda, tiene sentido buscar ambas columnas para este término. No quiero excluir un campo porque existe la posibilidad de que contengan varias palabras relacionadas. – RCNeil

Respuesta

21

Utilice esta ::

SELECT * FROM MyTable WHERE (Column1 LIKE '%keyword1%' OR Column2 LIKE 
'%keyword1%') AND (Column1 LIKE '%keyword2%' OR Column2 LIKE '%keyword2%'); 
+0

ah. Considero que los paréntesis son necesarios? Eso explicaría por qué no estaba funcionando antes ... – RCNeil

+1

sí ... la prioridad de AND es más alta que O por lo que las llaves son necesarias ... –

+0

impresionante. ¡Muchas gracias por su respuesta! – RCNeil

17

Lo más cercano a la sintaxis que está deseando es:

SELECT * FROM MyTable 
WHERE (CONCAT(Column1, Column2) LIKE '%keyword1%') 
AND (CONCAT(Column1, Column2) LIKE '%keyword2%') 

Nota: que el "%" en el inicio de la cadena de búsqueda excluye el uso de índices Si hay una gran cantidad de registros para buscar, sería mejor reconsiderar la implementación.

+0

¡Gracias por su respuesta! – RCNeil

+1

Si agrega dos columnas de caracteres juntas, se lanzarán como números y se agregarán. Lo más probable es que el resultado sea cero, y su cláusula WHERE nunca se evaluará como verdadera. Para concatenar columnas en MySQL, use CONCAT. –

+0

Gracias por eso, actualicé el SQL para usar CONCAT() ... – Mazrick

Cuestiones relacionadas