簡體   English   中英

MySQL-按一個字段中的搜索出現順序對行進行排序

[英]MySQL - Ordering rows by search occurrences in one field

我正在開發一個在Symfony2框架下用PHP編寫的電子商務網站; 目前,我需要開發一種為用戶提供搜索產品領域的方法。

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

ProductId - keywords
----------------------
1           child costume
2           costume green
3           child green
  • 如果我搜索“孩子”,則應顯示商品1和3;如果我搜索“服裝”,則應顯示商品1和2。
  • 麻煩來了:如果我搜索“綠色服裝”,則應顯示所有三個產品,因為它們都具有所有關鍵字,但是,我需要第二個產品比其他產品具有更高的相關性,因為它出現的次數更多,因此產品2應該高於其余產品。

所以我的問題是,有什么方法可以不使用PHP代碼而僅使用MySQL來實現呢? 謝謝。

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

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)上的索引,而您使用存儲關鍵字的方法無法做到這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM