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

pdkcd3nj  于 2021-06-18  发布在  Mysql
关注(0)|答案(3)|浏览(328)

我有一个编码问题,想知道是否有以下场景的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方法来执行此操作?

f5emj3cl

f5emj3cl1#

可以使用布尔表达式执行此操作:

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;

最后,如果你有这类问题,那么你应该做以下两件事之一:
如果文本真的是文本,那么请查看全文搜索功能。
如果文本实际上是关键字或用户之类的列表,那么请修复数据模型并使用连接/关联表。

nhhxz33t

nhhxz33t2#

如果在sql中完成,我会考虑使用允许排名的全文搜索(http://msdn.microsoft.com/en-us/library/cc879245.aspx)

ymzxtsji

ymzxtsji3#

我的想法:
使用solution:sql将值拆分为多行来转换为不同的单词列表
为每个原始行计算找到的行数。

相关问题