SQL查找字符串中的单词,按找到的单词数对结果进行排序

时间:2018-10-29 15:08:22

标签: mysql sql

我遇到了编码问题,想知道是否存在以下情况的SQL实现:

我想在文本列中搜索某些单词,并希望根据找到的单个单词的数量对结果进行排序。例如:

让我们找到包含以下内容的行:a b s

a b b c d e s
b d s w d a s
x d s g w d s
f e h w d s a

所需的结果将是:

a b b c d e s (it contains all 3 words)
b d s w d a s (it contains all 3 words)
f e h w d s a (it contains 2 words)
x d s g w d s (it contains 1 word)

是否建议您在例如PHP还是有一种有效的SQL方法?

3 个答案:

答案 0 :(得分:1)

您可以使用布尔表达式来做到这一点:

select t.*,
       ( (col like '%a%') +
         (col like '%b%') +
         (col like '%s%') +
       ) as num_matches
from t
order by num_matches desc;

如果单词之间用空格隔开,则:

select t.*,
       ( (concat(' ', col, ' ') like '% a %') +
         (concat(' ', col, ' ') like '% b %') +
         (concat(' ', col, ' ') like '% s %') +
       ) as num_matches
from t
order by num_matches desc;

最后,如果您遇到这种类型的问题,则应该执行以下两项操作之一:

  • 如果文本确实是文本,请研究全文搜索功能。
  • 如果文本实际上是诸如关键字或用户之类的列表,则修复您的数据模型并使用联结/关联表。

答案 1 :(得分:0)

如果在SQL中完成操作,我会考虑使用允许RANK({http://msdn.microsoft.com/en-us/library/cc879245.aspx

的全文搜索完成操作

答案 2 :(得分:0)

我的想法:

  1. 使用解决方案SQL split values to multiple rows
  2. 转换为不同的单词列表
  3. 为每个原始行计算找到的行。