A documentação do MySQL tem uma boa página com informações sobre quais operadores têm precedência.
A partir dessa página,
12.3.1. operador precedente
As precedências do operador são mostradas na lista a seguir, da precedência mais alta para a mais baixa. Os operadores que são mostrados juntos em uma linha têm a mesma precedência.
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), :=
Portanto, sua 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%"
seria 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%")
Em caso de dúvida, use parênteses para deixar sua intenção clara. Embora as informações na página do MySQL sejam úteis, pode não ser imediatamente óbvio se a consulta for revisitada.
Você pode considerar algo como o seguinte. Observe que alterei o
title = "%hello world%"
para title like "%hello world%"
, já que isso se encaixa melhor com o objetivo que você descreveu. Select
*
from tablename
where
(
(display = 1)
or (display = 2)
) and (
(content like "%hello world%")
or (tags like "%hello world%")
or (title like "%hello world%")
)