Документацията на MySQL има добра страница с информация кои оператори имат предимство.
От тази страница,
12.3.1. Приоритет на оператора
Приоритетите на операторите са показани в следния списък, от най-високото до най-ниското. Операторите, които са показани заедно на ред, имат същия приоритет.
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), :=
Така че вашата оригинална заявка
Select
*
from tablename
where
display = 1
or display = 2
and content like "%hello world%"
or tags like "%hello world%"
or title = "%hello world%"
ще се тълкува като
Select
*
from tablename
where
(display = 1)
or (
(display = 2)
and (content like "%hello world%")
)
or (tags like "%hello world%")
or (title = "%hello world%")
Когато се съмнявате, използвайте скоби, за да изясните намерението си. Въпреки че информацията на страницата на MySQL е полезна, може да не е веднага очевидна, ако заявката бъде преразгледана.
Може да помислите за нещо като следното. Имайте предвид, че промених title = "%hello world%"
до title like "%hello world%"
, тъй като това отговаря по-добре на целта, която описахте.
Select
*
from tablename
where
(
(display = 1)
or (display = 2)
) and (
(content like "%hello world%")
or (tags like "%hello world%")
or (title like "%hello world%")
)