2011-02-08 2 views
2

У меня есть таблица с именами пользователей и категорий, и у меня есть запрос:Простой SQL вопрос поможет

select * from articles where username='333' or username='222' and category='movies' 

Я хочу это вернуть только записи от пользователей «333» и «222», которые из категория 'movies', но это возвращает все статьи этих пользователей из всех категорий.

Что я делаю неправильно?

ответ

3
SELECT * 
    FROM articles 
    WHERE (username='333' OR username='222') 
     AND category='movies' 
+0

бил меня несколько секунд, приветствий –

+0

@K Ivonov - вы ответ говорит 4 минимум назад «предыдущая тема следующая тема» –

3
select * from articles where (username='333' or username='222') and category='movies' 
0

Вы ожидаете, что это будет проанализирован:

select * from articles where (username='333' or username='222') and category='movies' 

Но вместо этого он обрабатывается:

select * from articles where username='333' or (username='222' and category='movies') 

Помещенные в скобки, и он будет делать правильные вещи.

2

Возможно, у вас недостаток скобок. Если вы более явны, то примерно:

select * from articles where (username='333' or username='222') and category='movies' 

тогда вам все будет в порядке.

Там также IN ключевых слов, так что вы можете сделать:

select * from articles where username in ('333', '222') and category='movies' 
2

оператор precedure. Возможно, вы захотите прочитать руководство. И связывает крепче (имеет более высокий приоритет, чем) «OR», следовательно, ваш запрос быть разобран как

select * 
from articles 
where username = '333' or (username = '222' and category = 'movies') 

Вы должны использовать скобки для явного указания порядка операций, которые вы хотите:

select * 
from foo 
where (user = 'a' or user = 'b') 
    and category = 'c' 

альтернативно используйте in:

select * 
from foo 
where user in ('a','b') 
    and category = 'c' 
3

Это может помочь использовать ключевое слово IN вместо AND/OR.

select * 
from articles 
where username in ('333','222') and category='movies' 

IN позволяет указать список значений.

Также, если вы хотите MIX И/ИЛИ, убедитесь, что вы скопируете их. Если вы не скопируете их, приоритет в большинстве основных СУБД равен AND до OR (скобка вокруг ANDS).

select * 
from articles 
where (username = '333' or username = '222') and category='movies' 

Как вы можете видеть здесь (Operator Precedence (TSQL 2005), AND приходит под номером 7, тогда как OR приходит под номером 8.

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