2011-07-10 103 views
2

我想根據搜索關鍵字的相關性來搜索表中的記錄。如何在mysql中按相關順序獲取搜索結果?

我的查詢是:

SELECT * 
FROM downloads 
WHERE (
    (name LIKE '%Micky Mobile%') 
    OR (name LIKE '%Micky%' OR name LIKE '%Mobile%') 
    OR (name LIKE '%Micky%') 
    OR (name LIKE '%Mobile%') 
) AND app='1' 

這工作得很好,但問題是:

我從這個查詢想要的是有名字「你好米奇手機T」在第一名的行。

排名第2位的「Hello Micky T Mobile」。

行有「你好米奇T」在第3位。

在第4位有「Hello Mobile T」的行。

但上面的查詢通過id(自動遞增字段)給出ASC順序的結果。

聯盟解決了我的問題,但它需要更多的時間,它應該(我想)。 必須有其他方式。

+1

更確切地說,它不通過ID返回ASC順序的結果,但而是以_default_順序返回結果,在MySQL中,我相信這代表了插入順序。在很多情況下,這將與auto-inc id的ASC訂單相同,但這是_not_保證的,不應該依賴。我提到這只是一個附註,因爲我知道這不是你問題的真正意義。 – Flimzy

+0

謝謝你指出。在我的情況下,我正在通過ID獲得ASC順序的結果。 – Sunny

回答

2

首先,它看起來像你在搜索Micky和Mobile兩次。

其次,我相信MySQL有有關聯的選項內置到他們一些全文搜索的可能性: MATCH (col1,col2,...) AGAINST (expr [search_modifier])

+0

我現在正在使用聯盟。 「Micky」和「Mobile」會被搜索兩次,因爲它們需要按照「相關性」順序顯示。在這個查詢之後有一個php代碼來過濾重複的結果。 我知道它的雜亂..:p 我檢查了「全文檢索」。它幾乎與我正在尋找的幾乎沒有什麼例外一樣,它給予比我需要的東西更重的權重。 例如:{SELECT name FROM DOWNLOAD WHERE MATCH(name)AGAINST('micky mobile');}返回「Micky T Micky」,第二名返回「Micky Mobile」。 它優先考慮重複一次而不是重複一次的兩個單詞兩次。 – Sunny