2014-02-17 30 views
0

我正在開發一個電子商務網站,使用Symfony2框架在PHP下編寫;目前我需要開發一種方法爲用戶提供搜索產品的領域。MySQL - 通過在一個字段中搜索事件排序行

在每個產品中;我有一個名爲'searchKeywords'的字段,它爲此搜索引擎存儲特殊關鍵字;因此,假設我們有以下產品的數據:

ProductId - keywords 
---------------------- 
1   child costume 
2   costume green 
3   child green 
  • 如果我要尋找的「孩子」,產品#1和#3應該顯示,如果我搜索「服裝」,產品#1應顯示#2。
  • 問題在於:如果我搜索'服裝綠色',所有三種產品都應該顯示,因爲它們都具有所有關鍵字,但是,我需要#2產品比其他產品更具關聯性,因爲它具有更多的搜索事件,所以產品#2應該高於其餘。

所以我的問題是,有沒有什麼辦法可以實現,而不使用PHP代碼,只有MySQL?謝謝。

+0

您可能需要執行全文搜索https://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html –

+2

您是否考慮過正常化? – Strawberry

回答

1

如果每個輸入關鍵字都在單獨的變量中,則可以執行此操作。如果您將關鍵字用逗號分隔的空格代替:

select . . . 
where find _in_set($keyword1, keywords) > 0 or 
     find _in_set($keyword2, keywords) > 0 or 
     find _in_set($keyword3, keywords) > 0 
order by (find _in_set($keyword1, keywords) > 0 + 
      find _in_set($keyword2, keywords) > 0 + 
      find _in_set($keyword3, keywords) > 0 
     ); 

用空格,你可以這樣做:

where concat(' ', $keywords, ' ') like concat(' %', $keyword1, '% ') or 
     concat(' ', $keywords, ' ') like concat(' %', $keyword2, '% ') or 
     concat(' ', $keywords, ' ') like concat(' %', $keyword3, '% ') 
order by concat(' ', $keywords, ' ') like concat(' %', $keyword1, '% ') + 
     concat(' ', $keywords, ' ') like concat(' %', $keyword2, '% ') + 
     concat(' ', $keywords, ' ') like concat(' %', $keyword3, '% ') 

額外的空間是防止「紅」從匹配「重做」。

但是,你不應該在這樣的列表中存儲關鍵字。你應該有一個關聯/聯結表。這樣的表格將具有ProductId的列和keyword的列。多個關鍵字將存儲在不同的行上。有了這張表,查詢,簡直是:

from ProductKeywords pk 
where pk.keyword in ($keyword1, $keyword2, $keyword3) 
group by pk.ProductId 
order by count(*) desc; 

另一個優點這個疑問的是,它可以在ProductKeywords(keyword),你不能與你的存儲關鍵字的方法做採取指數的優勢。