Mysql or/and precedence? Mysql or/and precedence? mysql mysql

Mysql or/and precedence?


The MySQL documentation has a good page with information on which operators take precedence.

From that page,

12.3.1. Operator Precedence

Operator precedences are shown in the following list, from highest precedence to the lowest. Operators that are shown together on a line have the same precedence.

INTERVALBINARY, COLLATE!- (unary minus), ~ (unary bit inversion)^*, /, DIV, %, MOD-, +<<, >>&|= (comparison), <=>, >=, >, <=, <, <>, !=, IS, LIKE, REGEXP, INBETWEEN, CASE, WHEN, THEN, ELSENOT&&, ANDXOR||, OR= (assignment), :=

So your original query

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

would be interpreted as

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

When in doubt, use parenthesis to make your intent clear. While the information on the MySQL page is helpful, it may not be immediately obvious if the query is ever revisited.

You might consider something like the following. Note that I've changed the title = "%hello world%" to title like "%hello world%", since that fits better with the goal you've described.

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


Run this query:

select 1 or 1 and 0

If it comes out as 1, then that means the precedence is:

select 1 or (1 and 0)

if it comes out 0, then the precedence is:

select (1 or 1) and 0

Spoiler: it comes out 1

That is to say, ANDs are evaluated before ORs, or as I like to say, ANDs are stickier.


You need to use brackets for your multiple OR conditions. And for display = 1 OR display = 2 you can use display IN(1,2). Try this:

SELECT * FROM tableNameWHERE display IN (1,2)AND (content LIKE "%hello world%" OR tags LIKE "%hello world%" OR title LIKE "%hello world%")

For more info look at MySQL: Operator Precedence