如果每个输入关键字都在单独的变量中,则可以执行此操作。如果您将关键字用逗号分隔的空格代替:
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)
,你不能与你的存储关键字的方法做采取指数的优势。
您可能需要执行全文搜索https://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html –
您是否考虑过正常化? – Strawberry