Dokumentace MySQL má dobrou stránku s informací o tom, kteří operátoři mají přednost.
Z této stránky
12.3.1. Priorita operátora
Priority operátorů jsou uvedeny v následujícím seznamu, od nejvyšší po nejnižší. Operátory zobrazené společně na řádku mají stejnou prioritu.
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), :=
Takže váš původní dotaz
Select
*
from tablename
where
display = 1
or display = 2
and content like "%hello world%"
or tags like "%hello world%"
or title = "%hello world%"
by bylo interpretováno jako
Select
*
from tablename
where
(display = 1)
or (
(display = 2)
and (content like "%hello world%")
)
or (tags like "%hello world%")
or (title = "%hello world%")
V případě pochybností použijte závorky, aby byl váš záměr jasný. I když jsou informace na stránce MySQL užitečné, nemusí být hned zřejmé, zda se dotaz někdy vrátí.
Můžete zvážit něco jako následující. Všimněte si, že jsem změnil title = "%hello world%"
na title like "%hello world%"
, protože to lépe odpovídá cíli, který jste popsali.
Select
*
from tablename
where
(
(display = 1)
or (display = 2)
) and (
(content like "%hello world%")
or (tags like "%hello world%")
or (title like "%hello world%")
)