Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Mysql ou/e precedência?


A documentação do MySQL tem uma boa página com informações sobre quais operadores têm precedência.

A partir dessa página,

12.3.1. operador precedente

As precedências do operador são mostradas na lista a seguir, da precedência mais alta para a mais baixa. Os operadores que são mostrados juntos em uma linha têm a mesma precedência.
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), :=

Portanto, sua consulta original
Select
    *
from tablename 
where
    display = 1
    or display = 2
    and content like "%hello world%"
    or tags like "%hello world%"
    or title = "%hello world%"

seria interpretado como
Select
    *
from tablename 
where 
    (display = 1)
    or (
        (display = 2)
        and (content like "%hello world%")
    )
    or (tags like "%hello world%")
    or (title = "%hello world%")

Em caso de dúvida, use parênteses para deixar sua intenção clara. Embora as informações na página do MySQL sejam úteis, pode não ser imediatamente óbvio se a consulta for revisitada.

Você pode considerar algo como o seguinte. Observe que alterei o title = "%hello world%" para title like "%hello world%" , já que isso se encaixa melhor com o objetivo que você descreveu.
Select
    *
from tablename 
where
    (
        (display = 1)
        or (display = 2)
    ) and (
        (content like "%hello world%")
        or (tags like "%hello world%")
        or (title like "%hello world%")
    )