La documentation MySQL a une bonne page avec des informations sur les opérateurs prioritaires.
À partir de cette page,
12.3.1. Priorité des opérateurs
Les priorités des opérateurs sont affichées dans la liste suivante, de la priorité la plus élevée à la plus basse. Les opérateurs affichés ensemble sur une ligne ont la même priorité.
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), :=
Donc, votre requête d'origine
Select
*
from tablename
where
display = 1
or display = 2
and content like "%hello world%"
or tags like "%hello world%"
or title = "%hello world%"
serait interprété comme
Select
*
from tablename
where
(display = 1)
or (
(display = 2)
and (content like "%hello world%")
)
or (tags like "%hello world%")
or (title = "%hello world%")
En cas de doute, utilisez des parenthèses pour clarifier votre intention. Bien que les informations sur la page MySQL soient utiles, il peut ne pas être immédiatement évident si la requête est un jour revisitée.
Vous pourriez envisager quelque chose comme ce qui suit. Notez que j'ai changé le title = "%hello world%"
au title like "%hello world%"
, car cela correspond mieux à l'objectif que vous avez décrit.
Select
*
from tablename
where
(
(display = 1)
or (display = 2)
) and (
(content like "%hello world%")
or (tags like "%hello world%")
or (title like "%hello world%")
)