Die MySQL-Dokumentation hat eine gute Seite mit Informationen darüber, welche Operatoren Vorrang haben.
Von dieser Seite,
12.3.1. Operatorpriorität
Operatorprioritäten werden in der folgenden Liste angezeigt, von der höchsten bis zur niedrigsten Priorität. Operatoren, die zusammen in einer Zeile angezeigt werden, haben dieselbe Priorität.
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), :=
Also Ihre ursprüngliche Anfrage
Select
*
from tablename
where
display = 1
or display = 2
and content like "%hello world%"
or tags like "%hello world%"
or title = "%hello world%"
würde interpretiert als
Select
*
from tablename
where
(display = 1)
or (
(display = 2)
and (content like "%hello world%")
)
or (tags like "%hello world%")
or (title = "%hello world%")
Verwenden Sie im Zweifelsfall Klammern, um Ihre Absicht deutlich zu machen. Obwohl die Informationen auf der MySQL-Seite hilfreich sind, ist es möglicherweise nicht sofort ersichtlich, ob die Abfrage jemals erneut aufgerufen wird.
Sie könnten etwas wie das Folgende in Betracht ziehen. Beachten Sie, dass ich den title = "%hello world%"
geändert habe zu title like "%hello world%"
, da dies besser zu dem von Ihnen beschriebenen Ziel passt.
Select
*
from tablename
where
(
(display = 1)
or (display = 2)
) and (
(content like "%hello world%")
or (tags like "%hello world%")
or (title like "%hello world%")
)