回答

收藏

按大多数匹配选择和排序

技术问答 技术问答 235 人阅读 | 0 人回复 | 2023-09-13

假设我爆炸了在搜索中传递的字符串。示例: “如果有只狗” “如果有只狗” (傻傻的美国人)。
( w" ^8 X8 J8 S6 _我们基于“”爆炸,因此结果…  ]6 o. ]+ s, N( v
if
! p3 o9 [" B2 Ithere- p  R! Z7 k( S2 z1 w; x
were
2 [: w$ c( D9 w6 g4 }4 o8 V1 Ga5 v, r  B+ M3 i- g: V0 }# E
dog
& `0 T. B9 g: |" s! Q现在我要运行一个 SQL select * from table_name query where column_name like
! G; _+ r% R; {& g( {$ A. }) Y. {: ?'%something%' or column_name like '%somethingelse%'...
( H" @' Q1 a1 a9 t. |% ^, N2 ~我试图确定如何搜索包含最多匹配项的行和表。(即,如果第 45 行包含上述拆分项目中的 4个 ,而第 21 行仅包含 2个 ,则第
! E$ j% B8 s+ }- n45 行应显示在结果的顶部)。5 P0 k# F4 F& l6 `/ D2 b
这将是原始的“搜索相关性”逻辑。在SQL中是否有针对此类检索的特定术语?" H/ i7 l( u% g/ [& ?8 j
有什么建议吗?; C$ L& g& z% x7 Z
                $ N0 ~7 f0 X8 P! _1 H
解决方案:
0 r7 B# I  q' h# c# A/ g  i  Q- n: L               
& \1 X5 z  a9 i7 Z0 [4 U& a. z& o
) R/ H3 e6 z" h' q8 f6 D7 W$ x+ y; N% p7 F5 q( W/ S  T  R/ H
                只需将比较放在order by子句中,使用case语句将它们转换为0/1,然后将它们加起来即可:1 g! ~. L, q( }# D7 P* y
select *
  j. T) D' x8 h* W4 X6 q; E% mfrom table_name query8 F8 N$ c0 [. ~0 F' Q2 c# {7 z. K
where column_name like '%something%' or column_name like '%somethingelse%'  D8 D6 B8 @' N% a5 U9 U
order by ((case when column_name like '%something%' then 1 else 0 end) +1 h2 P- e& J  s( B) u& j2 ^
          (case when column_name like '%somethingelse%' then 1 else 0 end)2 ^7 \. l( `: v) N0 I8 ?4 y( J0 X1 N
          . . .
+ H: ^2 T) P" F) D         ) desc" z7 Z2 x( y5 C
我倾向于将查询写为:
) S( a. T! C8 V; xselect (Match1+Match2+. . .) as NumMatches,
4 u' u3 n8 J6 c2 @, `4 I4 `0 Qfrom (select t.*,* P  G% n1 O! P5 ?
             (case when column_name like '%something%' then 1 else 0 end) as Match1,
1 e) x: |$ x$ N1 x) F& y( H             . . .5 ?5 C. C: O$ y3 ~! Q. @
      from tablename
5 y. m6 T& ~3 ^  K" ^  }0 u- L; n     ) t: a8 S1 P' G+ B. D; c( c
order by NumMatches desc
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则