2011-02-08 65 views
2

我有一个用户名和类别表和我有查询:简单的SQL问题帮助

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

我想这是从用户的“333”和“222”,这是从只返回记录'电影'类别,但是这会返回来自所有类别的所有用户的文章。

我在做什么错?

回答

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

由几秒钟,欢呼声 – 2011-02-08 19:40:29

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,请确保你括起来。如果不包括它们,则大多数主要RDBMS中的优先是AND之前的AND(围绕ANDS)。

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

正如你可以从这里看到(Operator Precedence (TSQL 2005)AND在7号进来,而OR在第进来8