2011-06-01 105 views
1

我知道这个SQL查询是错误的,或者我错过了一些东西,但我有一个充满消息的表。我想获得所有消息,其中用户ID是ether 1或2,而reply_to是0.但是用我的SQL查询,它显示了答复,并且现在不是用户2的帖子。SQL查询不想工作

这是我的SQL

SELECT * 
FROM `msg` 
WHERE 
    `userid` LIKE '1' 
    OR 
    `user_id` LIKE '2' AND `reply_to` LIKE '0' 
ORDER BY `timestamp` DESC 
LIMIT 0,10; 

如何修复我的查询以完成我想要的操作?

+3

对于精确匹配,使用'='而不是'LIKE'。 – 2011-06-01 11:09:11

+0

也是“1”而不是“1”,而“OR”的优先级低于“AND”的事实。我格式化了您的查询,以显示它实际尝试执行的操作。 – GSerg 2011-06-01 11:11:00

回答

4

这个怎么样?:

SELECT * FROM `msg` 
    WHERE `userid` in ('1','2') AND `reply_to`='0' 
    ORDER BY `timestamp` DESC LIMIT 0,10; 
+0

请注意你的报价! – 2011-06-01 11:10:52

+0

@Jon:对不起,我没有得到你。哪些引号? – 2011-06-01 11:13:27

+0

哇。这工作!我会尽可能地接受它。 @Harry Joy,在你编辑之前,你有一个失踪的' – Colum 2011-06-01 11:14:08

1

TRY

SELECT * FROM `msg` 
     WHERE `userid` IN (1,2) AND `reply_to`='0' 
     ORDER BY `timestamp` 
     DESC LIMIT 0,10; 
0

在我看来,如果你需要括号添加到您的WHERE条款,以确保ORAND部分的执行顺序是你想要的方式。

0

尝试:

SELECT * 
FROM `msg` 
WHERE (`userid` = '1' OR `user_id` = '2') 
AND `reply_to` = '0' 
ORDER BY `timestamp` DESC LIMIT 0,10; 

的括号是重要的一点。当您不搜索通配符时,应该使用=而不是Like

您也可以使用in作为user_id检查。

0

你需要使用括号(我假设这些工作在mysql中,就像他们在mssql中那样)来帮助它知道where子句的哪些条件是可接受的。

SELECT *FROM `msg` 
WHERE (`userid` LIKE '1' 
OR `user_id` LIKE '2') 
AND `reply_to` LIKE '0' 
ORDER BY `timestamp` 
DESCLIMIT 0,10; 
0

取决于你在你的条件实际上是经过了什么,你要么需要:

SELECT * FROM `msg` 
WHERE (`userid` IN ('1','2')) 
    AND (`reply_to` = '0') 
ORDER BY `timestamp` DESC 
LIMIT 0, 10; 

...或:

SELECT * FROM `msg` 
WHERE (`userid` = '1') 
    OR (
     (`userid` = '2') 
    AND (`reply_to` = '0') 
    ) 
ORDER BY `timestamp` DESC 
LIMIT 0, 10; 
3

您有说,一个条件:

user=1 or user=2 and reply_to=0 

如果这被评估为像(user=1 or user=2) and reply_to=0然后你会得到你想要的结果,无回答的消息,其中用户是user1或user2。但是,如果评估类似user=1 or (user=2 and reply_to=0)将返回所有用户1的消息,并且返回user2的未回复消息,所以存在一些不明确之处。

我的建议是:从来没有,我的意思是永远,混合的and,并在同等条件下的or。当然,有优先规则,它会告诉你,p or q and r是以某种方式评估的,但它们在不同的平台,不同的语言,甚至不同的实现中可能会有所不同。想象一下,如果不是3,那么有15个条件?

始终使用圆括号来分隔和/或阻止。编译器或数据库不关心或不需要它们,但是当我们可以设想计算机实际指示要做什么时,人类的思想就会更好地工作。

你可以重写查询,如:

SELECT * FROM msg 
    WHERE (userid=1 OR user_id=2) 
    AND reply_to = 0 
ORDER BY timestamp DESC 

那里的条件之间的关系更为明显。

P.S.如果您实际上没有使用LIKE通配符,请避免使用LIKE

+0

+1之前的错误,未给出替代解决方案 – SinistraD 2011-06-02 00:48:51