MYSQL多个WHERE IN导致LIKE被忽略(?)

时间:2012-07-28 02:05:11

标签: mysql sql

我的查询不起作用。我通过使用单个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部分将被完全忽略。

任何想法为什么mutliple IN语句会导致LIKE被忽略?我无法理解为什么:重新安排查询没有影响(将LIKE移动到结束与开始)

2 个答案:

答案 0 :(得分:5)

Precendence?你不应该使用括号来区分AND和OR吗? status_id IN('x')如果为true,则会忽略表达式的其余部分。

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 :(得分: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') )