MySQL WHERE无法正常工作

时间:2014-05-01 06:39:27

标签: php mysql select

我有一个category.php页面,其中显示了给定类别($ tagname)中enabled = 1的所有文章。当一篇文章只有一个标签(和两个空标签)时,一切都很好。该文章将显示在此category.php页面上(启用时设置为1)。但是,如果填充了至少两个标签,那么该文章将显示在category.php页面上,其中tag2 = $ tagname或者如果tag3 = $ tagname - 无论启用的字段包含什么(1表示启用,2表示禁用)!

底线 - 即使该文章的启用设置为2,为什么会显示?

SELECT *
FROM articles
WHERE enabled=1
  AND tag1='$tagname'
  OR tag2='$tagname'
  OR tag3='$tagname'

enabled, int
tag1, varchar(30)
tag2, varchar(30)
tag3, varchar(30)

谢谢!

4 个答案:

答案 0 :(得分:2)

AND优先于OR,因此在您的查询中

首先评估enabled=1 and tag1='$tagname',然后评估 将其结果与下一个OR表达式进行比较,依此类推......
除非您将AND条件与OR条件正确分开,否则输出将会出乎意料。

更改您的查询,如下所示:

SELECT * FROM articles 
 WHERE enabled=1 
   AND (tag1='$tagname' OR tag2='$tagname' OR tag3='$tagname')

请参阅Operator Precedence

答案 1 :(得分:1)

试试这个:

SELECT *
FROM articles
WHERE enabled=1
  AND (tag1='$tagname'
       OR tag2='$tagname'
       OR tag3='$tagname')

答案 2 :(得分:1)

使用此查询。

SELECT *
FROM articles
WHERE enabled=1
  AND (tag1='$tagname'
       OR tag2='$tagname'
       OR tag3='$tagname')

答案 3 :(得分:1)

尝试分离你的条件

SELECT *
FROM articles
WHERE enabled=1
  AND (tag1='$tagname'
       OR tag2='$tagname'
       OR tag3='$tagname')

所以现在它将检查结果,其中enabled = 1,任何标记结果都来自3