大于运算符不在查询中工作

时间:2013-01-31 02:26:40

标签: mysql sql operator-keyword

有人可以建议为什么在这个MySQL查询中忽略大于运算符吗?

$sql = "SELECT *
FROM `items`
WHERE `short_description` LIKE '%".$term."%'
    OR `description` LIKE '%".$term."%'
    AND `quantity` > 0
ORDER BY year DESC, denomination ASC, description ASC $max";

我在同一网站上有类似的查询

$sql = "SELECT *
FROM `items`
WHERE `category` = '".$cat_id."'
    AND `quantity` > 0
ORDER BY year DESC, denomination ASC, description ASC;";

一切都运作良好,除了第一个查询的数量比较,它让我感到难过。

4 个答案:

答案 0 :(得分:0)

您应该将ORAND条件分组,将它们括在括号中,

$sql = "SELECT * FROM `items` 
         WHERE  (`short_description` LIKE '%".$term."%' OR 
                 `description` LIKE '%".$term."%')  AND 
                  `quantity` > 0 
          ORDER BY year DESC, denomination ASC, description ASC $max";

后续问题:$max是一个包含LIMIT子句的变量吗?

作为旁注,如果变量的值( s )来自外部,则查询易受SQL Injection攻击。请查看下面的文章,了解如何防止它。通过使用PreparedStatements,您可以摆脱在值周围使用单引号。

答案 1 :(得分:0)

"SELECT * FROM items WHERE (short_description LIKE '%".$term."%' OR description LIKE 
'%".$term."%') 
AND quantity > 0 
ORDER BY year DESC, denomination ASC, description ASC $max";

试试......你有一个Or条件,和一个和。

答案 2 :(得分:0)

尝试

$sql = "SELECT *
FROM `items`
WHERE (`short_description` LIKE '%".$term."%'
    OR `description` LIKE '%".$term."%')
    AND `quantity` > 0
ORDER BY year DESC, denomination ASC, description ASC $max";

我在想你的OR声明就是问题。

答案 3 :(得分:0)

它不被忽视,只是你误解了它的应用方式。表达式:

WHERE `short_description` LIKE '%".$term."%' (call this XX,)
OR `description` LIKE '%".$term."%'          (          YY,)
AND `quantity` > 0                           (      and ZZ.)

被解释为:

where XX or (YY and ZZ)

而你可能想要的是:

where (XX or YY) and ZZ

因此,您必须覆盖默认解释,如下所示:

WHERE (`short_description` LIKE '%".$term."%' OR
       `description` LIKE '%".$term."%')
  AND `quantity` > 0

您的第二个查询没有此问题的原因是因为您没有混合ANDOR


此外,虽然与您的特定问题无关,但您应该非常警惕双端like条款,例如like '%something%' 。对于尺寸合适的桌子来说,它们是真正的性能杀手,并且有很多方法可以大大提高性能。

在这种情况下,如果您的桌子很小,可能无关紧要,但要注意这一点。