SQL查询不想工作

时间:2011-06-01 11:07:02

标签: mysql sql

我知道这个SQL查询错误,或者我遗漏了一些东西,但我有一个充满消息的表。我想获取用户id为ether 1或2的所有消息,并且reply_to为0.但是使用我的SQL查询,它显示了回复,现在不显示来自用户2的帖子。

这是我的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; 

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

7 个答案:

答案 0 :(得分:4)

怎么样?:

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

答案 1 :(得分: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),将返回所有user1的消息,以及user2的未回复消息,因此存在一些歧义。

我的建议是:从不,我的意思是,在相同的条件下混合andor。当然,优先级规则会告诉您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

答案 2 :(得分:1)

TRY

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

答案 3 :(得分:0)

在我看来,您需要在WHERE子句中添加括号,以确保ORAND部分的执行顺序符合您的要求。

答案 4 :(得分: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检查。

答案 5 :(得分: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; 

答案 6 :(得分: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;