我有一个问题,我在我的网站上进行全文搜索,并希望在此处排除一些结果是我使用的代码
SELECT *, MATCH(p_title, p_desc) AGAINST ('".$string."') AS score
FROM posts
WHERE MATCH(p_title, p_desc) AGAINST ('".$string."')
ORDER BY score DESC LIMIT 12
现在当我添加例如WHERE id!= 1 AND WHERE test!= 1到SELECT结束时 这不起作用,我用谷歌搜索但没有找到任何与此相关的内容。这有可能吗?
我找到了一种使用php的方法
if($id != $list['id'] AND $list['test'] != 1) {
// CODE
}
但这不是我想要的。 谢谢你的帮助
答案 0 :(得分:2)
如果你改变了
SELECT *, MATCH(p_title, p_desc) AGAINST ('".$string."') AS score
FROM posts
WHERE MATCH(p_title, p_desc) AGAINST ('".$string."')
ORDER BY score DESC LIMIT 12
要:
SELECT *, MATCH(p_title, p_desc) AGAINST ('".$string."') AS score
FROM posts
WHERE MATCH(p_title, p_desc) AGAINST ('".$string."')
AND (id <> 1) AND (test <> 1)
ORDER BY score DESC LIMIT 12
它应该可以工作,当然你不能在第一个之后添加额外的WHERE
条款
如果您想添加额外的项目进行过滤,则需要使用AND
。
另请注意,执行SELECT *
会降低您的查询方式。
更好地列出您要列出的字段,这将使您的查询更快
确保在p_title和p_desc上有一个索引以保持速度可接受。
如果您希望搜索更智能,并且还要返回与$string
相关的项目,则可以将代码更改为:
SELECT *, MATCH(p_title, p_desc) AGAINST ('".$string."') AS score
FROM posts
WHERE MATCH(p_title, p_desc) AGAINST ('".$string."' WITH QUERY EXPANSION)
AND (id <> 1) AND (test <> 1)
ORDER BY score DESC LIMIT 12
这将让MySQL进行第二次传递,其中第一遍中找到的术语用于查找与$ string不匹配的额外项目,但执行匹配中找到的数据第一遍。
请参阅:http://dev.mysql.com/doc/refman/5.5/en/fulltext-query-expansion.html