Mysql
 sql >> Base de données >  >> RDS >> Mysql

Mysql ou/et priorité ?

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