[英]MySQL - Ordering rows by search occurrences in one field
我正在開發一個在Symfony2框架下用PHP編寫的電子商務網站; 目前,我需要開發一種為用戶提供搜索產品領域的方法。
在每個產品中; 我有一個名為“ searchKeywords”的字段,該字段存儲此搜索引擎的特殊關鍵字。 因此,假設我們具有以下產品數據:
ProductId - keywords
----------------------
1 child costume
2 costume green
3 child green
所以我的問題是,有什么方法可以不使用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.