2011-04-07 102 views
1

我有一个问题,我做我的网站上全文搜索,并希望排除这里的一些结果是代码我使用mysql的全文检索排除结果

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和WHERE测试!= 1到SELECT结尾 这不起作用,我google了一下,但没有找到任何与此相关的内容。这是可能吗?

我发现用PHP

if($id != $list['id'] AND $list['test'] != 1) { 
// CODE 
} 

一个方法,但是这并不是我真正想要的东西。 感谢您的帮助

回答

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

+0

非常感谢您,感谢您使用查询扩展尖端 – VideoMan123 2011-04-07 17:02:46