Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL oder/und Vorrang?

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%")
    )