我知道这个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;
如何修复查询以完成我想要的操作?
答案 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的未回复消息,因此存在一些歧义。
我的建议是:从不,我的意思是,在相同的条件下混合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
。
答案 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
子句中添加括号,以确保OR
和AND
部分的执行顺序符合您的要求。
答案 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;