带有多个AND语句的MySQL查询似乎忽略了一个

时间:2011-01-19 08:51:37

标签: mysql

我正在尝试在MySQL数据库上运行查询,但我发现它似乎忽略了“状态”项。

SELECT * FROM  `posts`  
WHERE
      `tags` LIKE '%gda%' 
   OR `tags` LIKE '%contests%' 
   OR `tags` LIKE '%merch%' 
  AND `newsID` != '2134' 
  AND `status` > '1' 
ORDER BY  `postDate` DESC  LIMIT 5

在那个例子中,即使'status'设置为0,它仍然会拉动项目。我做错了什么?

5 个答案:

答案 0 :(得分:7)

问题在于OR / AND条件的优先级。 AND的优先级高于OR,这就是为什么它首先评估由AND(tags-merch,newsID-2134和status-1)连接的所有条件,然后评估两个标签 - gda和tags-contests)。

尝试添加括号:

SELECT *  
  FROM  `posts`  
 WHERE (`tags` LIKE  '%gda%' 
    OR  `tags` LIKE  '%contests%' 
    OR  `tags` LIKE  '%merch%')
   AND  `newsID` !=  '2134' 
   AND `status` > '1' 
ORDER BY  `postDate` DESC
LIMIT 5

答案 1 :(得分:1)

你尝试过类似的事情吗?

SELECT * FROM  `posts`  
WHERE
     ( `tags` LIKE '%gda%' 
   OR `tags` LIKE '%contests%' 
   OR `tags` LIKE '%merch%')
  AND `newsID` != '2134' 
  AND `status` > '1' 
ORDER BY  `postDate` DESC  LIMIT 5

答案 2 :(得分:1)

也许你应该使用一些括号我不知道你想要什么组合但是试试这个:

  SELECT * FROM  `posts`  
    WHERE
         ( `tags` LIKE '%gda%' 
       OR `tags` LIKE '%contests%' 
       OR `tags` LIKE '%merch%' 
      )
      AND `newsID` != '2134' 
      AND `status` > '1' 
    ORDER BY  `postDate` DESC  LIMIT 5

答案 3 :(得分:1)

通常混合OR和AND不是一种明智的做法,因为根据执行顺序得到不同的结果,运算符优先级(例如true or true and false)可以被评估为(true or true) and false - 屈服false或true or (true and false) - 屈服于真。

使用括号分隔OR和AND,执行顺序是显式的,如下所示:

SELECT * FROM  `posts`
WHERE (`tags` LIKE '%gda%' OR `tags` LIKE '%contests%' OR `tags` LIKE '%merch%')
  AND `newsID` != '2134'
  AND `status` > '1'
ORDER BY  `postDate` DESC  LIMIT 5 

答案 4 :(得分:1)

尝试使用括号来强调您的逻辑句子。如:

SELECT *  
  FROM  `posts`  
 WHERE  (`tags` LIKE  '%gda%' OR  `tags` LIKE  '%contests%' OR  `tags` LIKE  '%merch%') 
   AND  `newsID` !=  '2134' 
   AND `status` > '1' 
ORDER BY  `postDate` DESC  LIMIT 5

否则,你的逻辑会丢失。同样使用括号可以更容易地阅读您的SQL句子