2

我有一个不起作用的查询。我已经通过使用单个 IN 语句解决了这个问题(我用来构建查询的库导致了这种情况的发生),但我仍然很好奇为什么会发生这种情况。

查询如下:

SELECT * FROM (`table`) 
WHERE     `field` = 'false' 
      AND `something` LIKE '%string%' 
      AND `status_id` IN ('1') 
      OR `status_id` IN ('2') 
      OR `status_id` IN ('3') 

对我的查询是有道理的:从表中选择字段 = false 并且类似于字符串且状态 ID 为 1 或状态 ID 为 2 或状态 ID 为 3 的所有内容

当有多个 IN 语句时,查询的 LIKE 部分将被完全忽略。

任何想法为什么多个 IN 语句会导致 LIKE 被忽略?我不知道为什么:重新安排查询没有影响(将 LIKE 移到末尾而不是开头)

4

2 回答 2

5

优先级?您不应该使用括号来区分 AND 和 OR 吗?status_id如果为真,IN ('x') 将导致表达式的其余部分被忽略。

SELECT * FROM (`table`) 
WHERE     `field` = 'false' 
      AND `something` LIKE '%string%' 
      AND (`status_id` IN ('1') 
            OR `status_id` IN ('2') 
            OR `status_id` IN ('3') 
      )

这与

SELECT * FROM (`table`) 
WHERE     `field` = 'false' 
      AND `something` LIKE '%string%' 
      AND `status_id` IN ('1', '2', '3')

看看会发生什么,自己尝试一下。

SELECT * FROM (`table`) 
WHERE     `field` = 'false' 
      AND `something` LIKE '%string%' 
      AND `status_id` IN ('1') 
      OR 1=1    

问问自己这个查询应该返回什么

于 2012-07-28T02:12:12.283 回答
1

在包括 MySQL 在内的大多数语言中,and运算符的绑定比or. 因此,您的代码意味着

WHERE ( field = 'false' AND something LIKE '%string%' AND status_id IN ('1') )
OR status_id IN ('2') 
OR status_id IN ('3')

IN解决方法显然是在三个条件周围使用括号:

WHERE field = 'false'
AND something LIKE '%string%'
AND ( status_id IN ('1') OR status_id IN ('2')  OR status_id IN ('3') )
于 2012-07-28T02:21:23.143 回答