日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQL匹配多字段进行排序,搜索

發布時間:2025/3/15 数据库 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL匹配多字段进行排序,搜索 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

??? 談到搜索,一般就想起了SQL Server的FullTextSearch(全文搜索)功能,它確實強大,但使用起來也要做一些較為繁瑣的準備工作,一般小型的項目或者對搜索要求(包括性能需求)不是很高的情況下實用它還是有點太重型了。簡單的搜索用SQL查詢即可,但一般面臨的一個問題就是如何對搜索結果按匹配字段進行優先級排序

??? 例如有個產品表(Products),它的字段包:括產品ID產品名稱產品類別產品品牌產品簡介產品詳細介紹

字段類型
ProdIDint
ProdNamenvarchar
CategoryNamenvarchar
ProdBrandnvarchar
ProdIntronvarchar
ProdDescriptionnvarchar

? 現在我們要求通過某個關鍵字從Products表中搜索包含該關鍵字的記錄,凡是以下任何一個字段包含該關鍵字的記錄都列出來:ProdName, CategoryName , ProdBrand, ProdIntro, ProdDescription。 并且搜索結果按照前述字段的匹配優先級進行排序:

? 1)先列出字段ProdName匹配關鍵字的記錄,然后列出字段CategoryName匹配關鍵字的記錄,依此類推,最后列出字段ProdDescription匹配關鍵字的記錄;

? 2)在字段ProdName匹配關鍵字的所有記錄中,先列出字段CategoryName也匹配關鍵字的記錄,然后列出字段ProdBrand也匹配關鍵字的記錄,依次類推…

? 3)按照規則2遞歸排序每個記錄分組……

? 搜索匹配該關鍵字的所有記錄的SQL語句倒很簡單:

  • SELECT?*??
  • from?Products??
  • WHERE?ProdName?like?'%KeyWord%'?or?CategoryName?like?'%KeyWord%'?or?ProdBrand?like?'%KeyWord%'?or?ProdIntro?like?'%KeyWord%'?or?ProdDescription?like?'%KeyWord%'????
  • ? 但對搜索出的結果進行匹配優先級排序稍微有點困難。在用簡單的SQL進行搜索時有兩種方式來達到這個排序的目的:加權法多字段排序法(我瞎取的名字^-^)。

    一、加權法

     對搜索的每條記錄計算出一個排序權值來,然后將所有搜索結果按照這個排序權值進行降序排列即可。每條被搜索出的記錄的排序權值為該記錄所有字段的權值之和。某個字段的權值取決于該字段是否匹配關鍵字,如果不匹配則為,如果匹配則為改字段的匹配權值。字段的匹配權值計算方式為:

       fieldPriority = 2的i次冥(i為該字段在所有被搜索的字段優先級排序中倒排的位置

     例如,在我們示例中各字段的匹配權值為:

    字段

    倒排位置

    匹配權值

    ProdName

    16

    CategoryName

    8

    ProdBrand

    4

    ProdIntro

    2

    ProdDescription

    1

    ??? 之所以采用這種算法,是為了確保某個字段匹配的記錄的排序權值不會低于另外一條不匹配該字段后續字段都匹配的記錄的排序權值。例如記錄A中僅僅ProdName匹配關鍵字,所以它的排序權值為16,而記錄B中除了字段ProdName外其他字段都匹配,則其排序權值為15(8+4+2+1=15)。但記錄A仍然會排在記錄B前面。

    ?? 相應的SQL大致如下:?

  • SELECT?*, (??
  • ?????????????????????(case?when?charIndex(ProdName,KeyWord)>-1?then?16?else?0?end)?+??
  • ?????????????????????(case?when?charIndex(CategoryName,KeyWord)>-1?then?8?else?0?end)?+??
  • ?????????????????????(case?when?charIndex(ProdBrand,KeyWord)>-1?then?4?else?0?end)?+??
  • ?????????????????????(case?when?charIndex(ProdIntro,KeyWord)>-1?then?2?else?0?end)?+??
  • ?????????????????????(case?when?charIndex(ProdDescription,KeyWord)>-1?then?1?else?0?end)??
  • ??????????????????)??as?OrderPriority??
  • from?Products??
  • WHERE?ProdName?like?‘%KeyWord%' or?
  • ????????????CategoryName?like?‘%KeyWord%' or??
  • ????????????ProdBrand?like?‘%KeyWord%' or?
  • ????????????ProdIntro?like?‘%KeyWord%' or??
  • ????????????ProdDescription?like?‘%KeyWord%'??
  • Order?by?OrderPriority?desc??
  • 二、多字段排序法

    ???? 加權法實在是有點啰嗦,倒不如直接利用SQL可以對多個字段進行排序來實現更清晰更直接。實際上我們把每個字段是否匹配的權值分散到SQL的Order里即可,大致SQL如下:

  • SELECT?*??
  • from?Products??
  • WHERE?ProdName?like?‘%KeyWord%' or?
  • ????????????CategoryName?like?‘%KeyWord%' or??
  • ????????????ProdBrand?like?‘%KeyWord%' or?
  • ????????????ProdIntro?like?‘%KeyWord%' or??
  • ????????????ProdDescription?like?‘%KeyWord%'??
  • Order?by????????(case?when?charIndex(ProdName,KeyWord)>-1?then?0?else?1?end),??
  • ?????????????????????(case?when?charIndex(CategoryName,KeyWord)>-1?then?0?else?1?end),??
  • ?????????????????????(case?when?charIndex(ProdBrand,KeyWord)>-1?then?0?else?1?end),??
  • ?????????????????????(case?when?charIndex(ProdIntro,KeyWord)>-1?then?0?else?1?end),??
  • ?????????????????????(case?when?charIndex(ProdDescription,KeyWord)>-1?then?0?else?1?end)?
  • 總結

    以上是生活随笔為你收集整理的SQL匹配多字段进行排序,搜索的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。