0

好的,说,我有一个有 3 列的表:c1、c2、c3


C1 - C2 - C3
A2 - B2 - N2
K1 - B2 - N1
K1 - B3 - N1
L1 - A2 - C1

好的,当用户搜索 A1, A2, A3, B1, B2, ... 的任意组合时,系统可以选择最匹配的行(这意味着只要单词出现在 1 列中,系统会选择它,出现在更多列中的单词越多,匹配越接近)并根据最接近的匹配对它们进行排序

Ex1:用户搜索“K1 A2 C1 N1”,系统会显示:
K1 - B2 - N1
K1 - B3 - N1
A2 - B2 - N2
L1 - A2 - C1

Ex2:用户搜索“K1 A2 C1 N2 B2”,系统会显示:
A2 - B2 - N2
L1 - A2 - C1
K1 - B2 - N1
K1 - B3 - N1

我的解决方案是将搜索字符串拆分为单独的单词,然后根据表中的列搜索每个单词。但我不确定这是最佳查询,因为数据库必须在许多循环中进行搜索。

因此,如果您是数据库专家,那么在这种情况下最好的查询是什么?

4

1 回答 1

0
select c1
  ,c2
  ,c3
  ,case when c1 in ('K1','A2','C1','N1') then 1 else 0 end
  +case when c2 in ('K1','A2','C1','N1') then 1 else 0 end
  +case when c3 in ('K1','A2','C1','N1') then 1 else 0 end as sortweight
from theTable
where c1 in ('K1','A2','C1','N1')
or c2 in ('K1','A2','C1','N1')
or c3 in ('K1','A2','C1','N1')  order by sortweight desc
     ,c1
     ,c2
     ,c3

其他论坛的人提出了上述查询

于 2013-04-16T02:02:11.263 回答