过于具体的mysql查询无法正常工作

时间:2009-06-30 23:25:13

标签: php mysql

我编写了一个查询来查找基于当前id的标签的类似id,就像amazons一样,你也想要。问题是,在我的例子中,我想从此搜索中排除bookid 30。

这是我的问题:

注意:$ similar基本上是一个字符串,里面填充了一些带有一些“喜欢%item%或”的标签

$query = "SELECT * FROM books
          WHERE bookid !=30
          AND {$similar}
          AND visible ='1'
          AND level ='2'
          LIMIT 3";

不工作的部分是bookid!=我试过IS NOT,<>重新排序以及我能找到的其他任何东西。此查询仍然可以输出三行但仍包含bookid 30

有人可以解释这里发生了什么吗?我的查询变得过于复杂,需要重组吗?

我提出的糟糕的替代方案是将限制4个项目发送到while循环以获取每一行并排除我不需要的bookid。当我知道可以在查询中完成时,这似乎毫无意义。

我通过重建我的查询和$相似的字符串来解决这个问题 前

SELECT * FROM books WHERE bookid !=30 AND tags LIKE '%one%' OR tags LIKE '% two%' OR tags LIKE '% three%' AND visible ='1' AND level ='2' LIMIT 3

SELECT * FROM books WHERE bookid !=30 AND (bookid!=30 AND tags LIKE '%one%') OR (bookid!=30 AND tags LIKE '% two%') OR (bookid!=30 AND tags LIKE '% three%') AND visible ='1' AND level ='2' LIMIT 3

我注意到的一件事是奇怪的是bookid!=只有当有一个在beginging和每个之间喜欢或者...我尝试交换每个,查询不会运行,但当前字符串工作完美!

谢谢,

1 个答案:

答案 0 :(得分:5)

确保您的$相似变量包含在括号中。

如果OR位于中间,则将其评估为

(bookid != 30 AND item like '%item1%') OR (item like '%item2%' AND visible = 1 AND level= 2)

而不是

bookid != 30 AND (item like '%item1%' OR item like '%item2%') AND visible = 1 AND level= 2