我编写了一个查询来查找基于当前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和每个之间喜欢或者...我尝试交换每个,查询不会运行,但当前字符串工作完美!
谢谢,
答案 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