sql >> Base de Datos >  >> RDS >> Mysql

Mysql o/y precedencia?

La documentación de MySQL tiene una buena página con información sobre qué operadores tienen prioridad.

Desde esa página,

12.3.1. Precedencia de operadores

Las precedencias de los operadores se muestran en la siguiente lista, desde la precedencia más alta hasta la más baja. Los operadores que se muestran juntos en una línea tienen la misma precedencia.

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

Así que tu 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%"

se interpretaría como

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

En caso de duda, utilice paréntesis para dejar clara su intención. Si bien la información en la página de MySQL es útil, es posible que no sea inmediatamente obvio si alguna vez se revisa la consulta.

Podría considerar algo como lo siguiente. Tenga en cuenta que he cambiado el title = "%hello world%" al title like "%hello world%" , ya que encaja mejor con el objetivo que has descrito.

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