2012-07-28 86 views
2

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

查询如下:

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') 

查询我是有道理的:从表名where字段=假,什么是像字符串和状态ID为1或状态ID是在2选择一切或状态标识为3

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

任何想法为什么多重IN语句会导致LIKE被忽略?我无法理解为什么:重新排列查询没有任何影响(将LIKE移动到末尾而不是起点)

回答

5

Precendence?你不应该使用括号来区分AND和OR吗? 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  

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

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'))