2011-04-07 109 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