Mysql o / y precedencia?

Me pregunto cómo y / y funciona?

Por ejemplo, si quiero obtener todas las filas donde display = 1

Puedo hacer WHERE tablename.display = 1

y si quiero todas las filas donde display = 1 o 2

Puedo hacer WHERE tablename.display = 1 or tablename.display = 2

Pero, ¿y si quiero obtener todas las filas donde display = 1 o 2 y donde el contenido, las tags o el título contienen hello world

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

 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.

¿Leyó 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.

    La documentación de MySQL tiene una buena página con información sobre qué operadores tienen prioridad.

    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), := 

    Entonces tu consulta original

     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 interpretado 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, use paréntesis para aclarar su intención. 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%" a title like "%hello world%" , ya que se ajusta mejor al objective 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%") ) 

    Necesita usar corchetes para sus múltiples condiciones de 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 más información mira MySQL: Precedencia del operador

    Ejecuta esta consulta:

     select 1 or 1 and 0 

    Si sale como 1 , significa que la precedencia es:

     select 1 or (1 and 0) 

    si sale 0 , entonces la precedencia es:

     select (1 or 1) and 0 

    Spoiler: sale 1

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

    en todos los servidores SQL, AND tiene prioridad sobre OR , así que simplemente recuerde poner corchetes alrededor de su OR :

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

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