我正在开发一个电子商务网站,用Symfony2框架下的PHP编写;目前我需要开发一种方法来为用户提供搜索产品的领域。
在每个产品中;我有一个名为'searchKeywords'的字段,它存储了此搜索引擎的特殊关键字;所以,假设我们有以下产品数据:
ProductId - keywords
----------------------
1 child costume
2 costume green
3 child green
所以我的问题是,有没有什么方法可以实现这一点而不使用PHP代码,只有MySQL?感谢。
答案 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)
上的索引,而您无法使用存储关键字的方法。