Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL o/e precedenza?

La documentazione MySQL ha una buona pagina con informazioni su quali operatori hanno la precedenza.

Da quella pagina,

12.3.1. Precedenza dell'operatore

Le precedenze degli operatori sono mostrate nell'elenco seguente, dalla precedenza più alta alla più bassa. Gli operatori mostrati insieme su una riga hanno la stessa precedenza.

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), :=

Quindi la tua domanda originale

Select
    *
from tablename 
where
    display = 1
    or display = 2
    and content like "%hello world%"
    or tags like "%hello world%"
    or title = "%hello world%"

verrebbe interpretato come

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

In caso di dubbio, usa le parentesi per chiarire le tue intenzioni. Sebbene le informazioni sulla pagina MySQL siano utili, potrebbe non essere immediatamente evidente se la query viene mai rivista.

Potresti considerare qualcosa di simile al seguente. Nota che ho cambiato il title = "%hello world%" a title like "%hello world%" , poiché si adatta meglio all'obiettivo che hai descritto.

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