疯狂的mysql行为获得不同的结果与几乎相同的查询

时间:2014-09-07 12:02:39

标签: mysql sql search

我试图在我的网站上创建搜索功能。当我试一试时,我会得到非常疯狂的结果。

此查询正常工作:

SELECT * FROM (`products`) 
JOIN `products_field` ON `products`.`id` = `products_field`.`prod_id` 
WHERE menu_id=569 OR menu_id=952 AND (products.title LIKE '%mcgregor%' OR products_field.value LIKE '%mcgregor%') 
GROUP BY `prod_id`

但是当我改变菜单ID的位置时,就像你在下面看到的那样,它会得到mcgregor中没有任何内容的结果:

SELECT * FROM (`products`) 
JOIN `products_field` ON `products`.`id` = `products_field`.`prod_id` 
WHERE menu_id=952 OR menu_id=569 AND (products.title LIKE '%mcgregor%' OR products_field.value LIKE '%mcgregor%') 
GROUP BY `prod_id`

我做错了什么?

3 个答案:

答案 0 :(得分:3)

这样写

WHERE menu_id=952 OR menu_id=569 AND ...

当menu_id = 952时,mysql被认为是匹配(true),而-OR-右侧的内容甚至没有被评估,因为你说的是​​这个或另一个(其余的声明在哪里)你可以像这样包装这个OR:

WHERE (menu_id=952 OR menu_id=569) AND ...

或者你可以这样:

WHERE menu_id IN (952,569) AND ...

答案 1 :(得分:2)

尝试在菜单部分添加括号。

SELECT * FROM (`products`) 
JOIN `products_field` ON `products`.`id` = `products_field`.`prod_id` 
WHERE (menu_id=952 OR menu_id=569) AND (products.title LIKE '%mcgregor%' OR products_field.value     LIKE '%mcgregor%') 
GROUP BY `prod_id`

答案 2 :(得分:2)

解释很简单:第一个查询中的where子句

WHERE menu_id=569 OR (menu_id=952 AND (products.title LIKE '%mcgregor%' OR products_field.value LIKE '%mcgregor%'))

与第二种不同:

WHERE menu_id=952 OR (menu_id=569 AND (products.title LIKE '%mcgregor%' OR products_field.value LIKE '%mcgregor%'))

您应该使用括号以更清晰,例如(menu_id=569 OR menu_id=952) AND ....

此致