有人可以建议为什么在这个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;";
一切都运作良好,除了第一个查询的数量比较,它让我感到难过。
答案 0 :(得分:0)
您应该将OR
和AND
条件分组,将它们括在括号中,
$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
您的第二个查询没有此问题的原因是因为您没有混合AND
和OR
。
此外,虽然与您的特定问题无关,但您应该非常警惕双端like
条款,例如like '%something%'
。对于尺寸合适的桌子来说,它们是真正的性能杀手,并且有很多方法可以大大提高性能。
在这种情况下,如果您的桌子很小,可能无关紧要,但要注意这一点。