2012-01-18 76 views
-1

我似乎無法得到正在工作的搜索查詢...這是我當前的查詢。 (有人剛剛給我)搜索查詢不返回部分查詢

SELECT MATCH (username, first_name, last_name) AGAINST ('$search') AS relevance, DISTINCT(auto), user_id, username, first_name, last_name, email, sex, active, ppic, time_zone, adult_filter, ((CASE WHEN `username` LIKE '%$search%' THEN 2 ELSE 0 END) + (CASE WHEN `first_name` LIKE '%$search%' THEN 1 ELSE 0 END) + (CASE WHEN `last_name` LIKE '%$search%' THEN 1 ELSE 0 END)) AS relevance 
    FROM users, network WHERE MATCH (username, first_name, last_name) AGAINST ('$search' IN BOOLEAN MODE) ORDER BY relevance DESC, username 

哪個作品,除了它不會返回部分匹配,這是我需要發生的。

這裏是我的舊的查詢......

SELECT DISTINCT(auto), user_id, username, first_name, last_name, email, sex, active, ppic, time_zone, adult_filter, ((CASE WHEN `username` LIKE '%$search%' THEN 2 ELSE 0 END) + (CASE WHEN `first_name` LIKE '%$search%' THEN 1 ELSE 0 END) + (CASE WHEN `last_name` LIKE '%$search%' THEN 1 ELSE 0 END)) AS relevance 
FROM users, network 
WHERE `username` LIKE '%$search%' OR 
    `last_name`LIKE '%$search%' 
    OR `first_name` LIKE '%$search%' 
ORDER BY relevance DESC, username LIMIT 5 

除非你有多個的話它打破它返回部分值...。 (所以它正在搜索「約翰」而不是「約翰史密斯」)

我花了兩天的搜索查詢來找到一個適合我的需求,並且還沒有能夠做到這一點。誰能告訴我我做錯了什麼? (例如如何使它與部分詞彙和多個詞彙一起工作)。

任何幫助表示讚賞,謝謝。

回答

0

試着改變你的WHERE子句:

WHERE `username` LIKE '%$search%' OR 
     CONCAT(`first_name`,' ',`last_name`) LIKE '%$search%' 

這種嘗試匹配 - $searchusername場 - $searchfirst_name last_name

但是,它不會對安全防護裝置(比方說)如果$searchJohn Smith(兩個空格),等等 - 你可能想將其分配給$search(例如前以某種方式標準化的代碼方面的搜索詞,將所有出現的連續兩個或更多空格轉換爲一個空格)。

+0

那麼這肯定有幫助,但我不喜歡它是限制這樣的名字......例如,如果我要搜索用戶名和他們的全名,那麼它不會出現...... Isn'有沒有一種方法,我可以只搜索所有部分,並在結合數量最多的比賽結果放在第一位...? – Ian

+0

我能想到的唯一方法就是你用'OR CONCAT(...)LIKE'%$ search%''來覆蓋所有組合:'firstname lastname username','firstname username lastname','lastname firstname username ','姓氏用戶名'等。 –