2014-01-23 142 views
0
SELECT * FROM store WHERE 
concat_ws(name, type, location) LIKE :search1 OR :search2 OR :search3 

for($n=0; $n<$count; $n++) 
    $query->bindValue(':search'.$n, '%'.$search[$n].'%', PDO::PARAM_STR);} 
} 

我有一個搜索查詢,我把用戶的輸入分成數組,例如:array('i','love','apple');Mysql LIKE或最接近的匹配

我的問題是如何按最接近的順序進行排序?

它搜索3列,因此,如果用戶類型紐約的蘋果,它會返回許多內容與位置列紐約,許多內容都無關,與蘋果

回答

4

如果你想這樣做,你將需要全文檢索(http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html)。這比LIKE更復雜一點,但肯定更快更智能。

+0

以前我嘗試過全文搜索,因爲我的db會有很多中文,而且我做了一些測試,匹配反應很難搜索一些中文的內容 – Ben

+0

爲了能夠將這些語言中的單詞或其他索引術語添加到FULLTEXT索引,你必須對它們進行預處理,使它們被一些任意的分隔符(如「」「)分隔開來(http://dev.mysql.com/doc/refman/5.0/en/fulltext-natural-language.html) – Agares

+0

你是什​​麼意思? – Ben

2

你可以做到這一點沒有全文搜索(在默認值不會反正你的查詢,因爲「我」不會被作爲一個字處理工作):

order by ((concat_ws(name, type, location) LIKE :search1) + 
      (concat_ws(name, type, location) LIKE :search2) + 
      (concat_ws(name, type, location) LIKE :search3) 
     ) desc 

此訂單由大多數匹配最少。您的where子句也需要遵循相同的格式,並有三個不同的like子句。