2012-09-10 4 views
10

Мне интересно, как и/или работает?Mysql или/и приоритет?

Например, если я хочу, чтобы получить все строки, где дисплей = 1

я могу просто сделать WHERE tablename.display = 1

, и если я хочу, чтобы все строки, где дисплей = 1 или 2

я могу просто сделать WHERE tablename.display = 1 or tablename.display = 2

Но что, если я хочу, чтобы получить все строки, где дисплей = 1 или 2, и где любой из содержание, теги или заголовок содержит hello world

Как будет логика для этого?

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

Было бы моим предположением. но потом я могу прочитать это несколькими способами.

ли он считан:

(display = 1 or display = 2) and (content like "%hello world%" or tags like "%hello world%" or title = "%hello world%") 

или

((display = 1 or display = 2) and (content like "%hello world%")) or (tags like "%hello world%" or title = "%hello world%") 

т.д.

+2

http://dev.mysql.com/doc/refman/5.5/en/operator-precedence.html – zerkms

+0

Эти вещи учат во время ранних классов C/C++. –

+3

Тогда, я думаю, я должен зарегистрироваться для всего курса C/C++, чтобы узнать приоритет оператора:/ – Hailwood

ответ

22

Документация MySQL имеет good page с информацией, на которой операторы имеют приоритет.

С этой страницы,

12.3.1. Приоритет оператора

Привилегии оператора показаны в следующем списке: от наивысшего приоритета до самого низкого. Операторы, которые показаны вместе на линии, имеют одинаковый приоритет.

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

Так что ваш исходный запрос

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

будет истолковано как

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

Если вы сомневаетесь, используйте круглые скобки, чтобы сделать ваше намерение ясно. Хотя информация на странице MySQL полезна, она может быть не сразу очевидна, если запрос когда-либо пересматривается.

Вы можете подумать о следующем. Обратите внимание, что я изменил title = "%hello world%" на title like "%hello world%", так как это лучше подходит для цели, которую вы описали.

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

на всех серверах SQL, AND имеет приоритет над OR, так что просто не забудьте положить скобки ваш OR s:

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


btw (display = 1 or display = 2) равнозначно display in (1, 2).

+0

См. Мое дополнение к моему вопросу. это связано с отсутствием скобок, как это происходит? – Hailwood

3

Вам необходимо использовать скобки для своих многочисленных условий OR. А для display = 1 OR display = 2 вы можете использовать display IN(1,2). Попробуйте это:

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

Для получения дополнительной информации на вид MySQL: Operator Precedence

+0

Нет, это не сработает, как ожидалось – zerkms

+0

@zerkms Теперь посмотри. – hims056

1

Выполнить этот запрос:

select 1 or 1 and 0 

Если он выходит, как 1, то это означает, что приоритет является:

select 1 or (1 and 0) 

, если он выйдет 0, то преимущество является:

select (1 or 1) and 0 

Спойлера: он выходит 1

То есть, AND s вычисляется до OR с, или, как я хотел бы сказать, Анды являются липкими.

Смежные вопросы