MySQL - 在一个字段中按搜索事件排序行

时间:2014-02-17 15:34:44

标签: php mysql sql

我正在开发一个电子商务网站,用Symfony2框架下的PHP编写;目前我需要开发一种方法来为用户提供搜索产品的领域。

在每个产品中;我有一个名为'searchKeywords'的字段,它存储了此搜索引擎的特殊关键字;所以,假设我们有以下产品数据:

ProductId - keywords
----------------------
1           child costume
2           costume green
3           child green
  • 如果我搜索“孩子”,则应显示产品#1和#3,如果我搜索“服装”,则应显示产品#1和#2。
  • 遇到麻烦:如果我搜索“绿色服装”,那么所有三种产品都应该展示,因为所有产品都有关键字,但我需要#2产品比其他产品更具相关性,因为它有更多搜索事件,因此产品#2应该高于其余部分。

所以我的问题是,有没有什么方法可以实现这一点而不使用PHP代码,只有MySQL?感谢。

1 个答案:

答案 0 :(得分: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)上的索引,而您无法使用存储关键字的方法。