2012-09-10 18 views
10

Me pregunto cómo y/y funciona?¿Mysql o/y precedencia?

Por ejemplo, si quiero obtener todas las filas en la pantalla = 1

yo sólo puedo hacer WHERE tablename.display = 1

y si quiero todas las filas en la pantalla = 1 ó 2

sólo puedo hacer WHERE tablename.display = 1 or tablename.display = 2

Pero lo que si quiero obtener todas las filas en la pantalla = 1 ó 2 y donde cualquiera de el contenido, etiquetas, o el título contiene hello world

¿Cómo funcionaría la lógica?

Select * from tablename 
where display = 1 or display = 2 and content like "%hello world%" or tags like "%hello world%" or title = "%hello world%" 

Sería mi suposición. pero luego puedo leer eso de varias maneras.

Qué se lee como:

(display = 1 or display = 2) and (content like "%hello world%" or tags like "%hello world%" or title = "%hello world%") 

o como

((display = 1 or display = 2) and (content like "%hello world%")) or (tags like "%hello world%" or title = "%hello world%") 

etc.

+2

http://dev.mysql.com/doc/refman/5.5/en/operator-precedence.html – zerkms

+0

Estas cosas se enseñan durante las primeras clases de C/C++. –

+3

Entonces supongo que debería inscribirme en un curso completo de C/C++ solo para conocer la precedencia del operador:/ – Hailwood

Respuesta

22

La documentación de MySQL tiene una good page con información en la que los operadores tienen precedencia.

Desde esa página,

12.3.1. Precedencia del operador

Las precedencias del operador se muestran en la siguiente lista, desde la más alta hasta la más baja. Los operadores que se muestran juntos en una línea tienen la misma precedencia.

INTERVAL 
BINARY, COLLATE 
! 
- (unary minus), ~ (unary bit inversion) 
^ 
*, /, DIV, %, MOD 
-, + 
<<, >> 
& 
| 
= (comparison), <=>, >=, >, <=, <, <>, !=, IS, LIKE, REGEXP, IN 
BETWEEN, CASE, WHEN, THEN, ELSE 
NOT 
&&, AND 
XOR 
||, OR 
= (assignment), := 

Así su búsqueda original

Select 
    * 
from tablename 
where 
    display = 1 
    or display = 2 
    and content like "%hello world%" 
    or tags like "%hello world%" 
    or title = "%hello world%" 

se interpretaría como

Select 
    * 
from tablename 
where 
    (display = 1) 
    or (
     (display = 2) 
     and (content like "%hello world%") 
    ) 
    or (tags like "%hello world%") 
    or (title = "%hello world%") 

En caso de duda, utilice paréntesis para hacer que su intención clara. Si bien la información en la página de MySQL es útil, puede no ser inmediatamente obvio si la consulta alguna vez se vuelve a visitar.

Puede considerar algo como lo siguiente. Tenga en cuenta que he cambiado el title = "%hello world%" al title like "%hello world%", ya que se ajusta mejor al objetivo que ha descrito.

Select 
    * 
from tablename 
where 
    (
     (display = 1) 
     or (display = 2) 
    ) and (
     (content like "%hello world%") 
     or (tags like "%hello world%") 
     or (title like "%hello world%") 
    ) 
0

en todos los servidores SQL, AND tiene prioridad sobre OR, por lo que sólo recuerda poner corchetes su OR s:

select * from tablename 
where (display = 1 or display = 2) 
and (content like "%hello world%" 
     or tags like "%hello world%" 
     or title = "%hello world%") 


por tt (display = 1 or display = 2) es equivalente a display in (1, 2).

+0

Por favor, vea mi adición a mi pregunta. es en relación a no tener paréntesis cómo funciona? – Hailwood

3

Debe usar los soportes para sus múltiples condiciones OR. Y para display = 1 OR display = 2 puede usar display IN(1,2). Prueba esto:

SELECT * FROM tableName 
WHERE display IN (1,2) 
AND (content LIKE "%hello world%" 
OR tags LIKE "%hello world%" 
OR title LIKE "%hello world%") 

Para obtener más información vistazo a MySQL: Operator Precedence

+0

No, eso no funcionaría como se esperaba – zerkms

+0

@zerkms Ahora mira. – hims056

1

ejecuta esta consulta:

select 1 or 1 and 0 

Si sale como 1, entonces eso significa que la prioridad es:

select 1 or (1 and 0) 

si sale 0, entonces la prioridad es:

select (1 or 1) and 0 

Spoiler: sale 1

Es decir, AND s se evalúan antes OR s, o como me gusta decir, AND son más pegajoso.