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

ask*_*kon 0 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";
Run Code Online (Sandbox Code Playgroud)

不工作的部分是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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

谢谢,

gap*_*ple 5

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

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

(bookid != 30 AND item like '%item1%') OR (item like '%item2%' AND visible = 1 AND level= 2)
Run Code Online (Sandbox Code Playgroud)

代替

bookid != 30 AND (item like '%item1%' OR item like '%item2%') AND visible = 1 AND level= 2
Run Code Online (Sandbox Code Playgroud)