国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

分頁 + 模糊查詢 有坑!你知道嗎?

數(shù)據(jù)庫 MySQL
模糊查詢和分頁,如果分開用,一般是沒問題的。但如果它們要一起使用,一定要考慮排序問題。如果只是按照簡(jiǎn)單的時(shí)間或者id排序,有些特殊的業(yè)務(wù)場(chǎng)景,沒辦法滿足,很容易出現(xiàn)bug。

前言

不知道你有沒有使用過Mysql的like語句,進(jìn)行模糊查詢?

不知道你有沒有將查詢結(jié)果,進(jìn)行分頁處理?

模糊查詢,加上分頁處理,會(huì)有意想不到的坑,不信我們繼續(xù)往下看。

我之前提供過一個(gè)品牌查詢接口,給前端品牌選擇控件使用的。

當(dāng)時(shí)為了性能考慮,怕前端控件因?yàn)橐淮涡约虞d太多的品牌,而導(dǎo)致頁面卡死。

因此,對(duì)品牌查詢接口做了分頁處理。

剛開始品牌表的數(shù)據(jù)比較少,沒有出現(xiàn)什么問題。

后來,產(chǎn)品加需求了,在品牌下拉選擇控件中,讓用戶可以輸入自定義品牌。

在用戶添加品牌前,需要先查一下,如果該品牌存在,則使用已有品牌。如果不存在,則新增品牌。(這里是精確匹配)

這個(gè)需求很簡(jiǎn)單,很容易實(shí)現(xiàn)了。

后來,產(chǎn)品又加需求了,需要按名稱模糊查詢品牌。

該功能上線后,使用了很長(zhǎng)一段時(shí)間,也沒啥問題。

突然,在不經(jīng)意的某一天,這個(gè)功能卻出問題了。

到底怎么回事呢?

1、案發(fā)現(xiàn)場(chǎng)

某一天下午,運(yùn)營(yíng)找到測(cè)試反饋一個(gè)問題說:明明品牌蘇三,已經(jīng)存在了,但用戶輸入關(guān)鍵字:蘇三時(shí),系統(tǒng)沒有讓用戶直接選擇已有品牌,而是添加了一個(gè)叫:蘇三的自定義的品牌。

我過去一看,還真的有問題。

不一會(huì)兒,就定位到原因了,初步判斷是分頁的問題。

搜索關(guān)鍵字:蘇三,竟然出現(xiàn)了好幾頁的數(shù)據(jù),把我驚呆了,品牌表怎么多了這么多數(shù)據(jù)了。

我查了數(shù)據(jù)庫,其實(shí)數(shù)據(jù)量并不是特別多,但有些品牌名稱比較特殊,有些品牌名稱是多個(gè)品牌名稱拼接而成的,比如:蘇三,李四 或者 蘇三,李四,王五,這是一個(gè)品牌。

其實(shí)是品牌名稱建的不規(guī)范導(dǎo)致的問題,但已經(jīng)沒法讓運(yùn)營(yíng)修改品牌了,只能通過技術(shù)手段解決目前的問題。

查詢第一頁的數(shù)據(jù)sql:

select * from brand where name like '%蘇三%' 
order by edit_date desc limit 5;

執(zhí)行結(jié)果:

圖片

我們可以看到,圖中并沒有等于蘇三這兩個(gè)字的數(shù)據(jù)。

注意:為了好演示,這里給的每頁大小是5,真實(shí)的場(chǎng)景并非如此。

查詢第二頁的數(shù)據(jù)sql:

select * from brand where name like '%蘇三%' 
order by edit_date desc limit 5,5;

執(zhí)行結(jié)果:

圖片

從圖中看到,在第二行,出現(xiàn)了正好等于蘇三這兩個(gè)字的數(shù)據(jù)。

用戶搜索關(guān)鍵字:蘇三 時(shí),前端頁面在調(diào)用品牌查詢接口,pageNo默認(rèn)是1。由于能夠匹配關(guān)鍵字的數(shù)據(jù)太多了,第一頁返回不完,需要多頁才能全部返回。

前端獲取到第一頁的數(shù)據(jù)后,跟關(guān)鍵字:蘇三 做比較,發(fā)現(xiàn)沒有等于蘇三的品牌。

這樣就會(huì)在下拉控件中,自動(dòng)添加一個(gè)品牌:蘇三,同時(shí)在右邊增加自定義標(biāo)簽。

這樣就出問題了,明明蘇三這個(gè)品牌是有的,但用戶還能自定義一個(gè)蘇三,而不是直接選擇。

2、思考123

蘇三這個(gè)關(guān)鍵字,通過模糊查詢可以查詢出來,但由于品牌接口做了分頁,全匹配的品牌:蘇三,出現(xiàn)在第二頁了,才導(dǎo)致問題的產(chǎn)生。

如果要解決這個(gè)問題,讓它出現(xiàn)在第一頁不就OK了?

這時(shí)候,就有下面幾種解決方案。

(1)方案1

分頁查詢品牌接口,pageSize是5。

我們?yōu)槭裁床话裵ageSize調(diào)大一點(diǎn)?比如改成:200、500等。

這樣通過蘇三關(guān)鍵字,進(jìn)行模糊查詢的時(shí)候,結(jié)果基本都在第一頁。

這樣就能非常快速的解決問題。

但有個(gè)缺點(diǎn)就是:如果這次調(diào)大了pageSize,但后面查詢關(guān)鍵字的品牌又出現(xiàn)在第二頁怎么辦?

不可能一直改pageSize吧?

(2)方案2

把分頁查詢接口的數(shù)據(jù),拆分成兩部分:

  1. 精確查詢
  2. 模糊查詢

在代碼中做處理的時(shí)候,先根據(jù)關(guān)鍵字精確查詢,即sql中使用name='蘇三',這種方式查詢一次數(shù)據(jù)。

如果沒查出數(shù)據(jù),則再直接用like '%蘇三'進(jìn)行模糊查詢。

如果查出了一條數(shù)據(jù),則把它放在返回結(jié)果集合中的第一位置。接下來,使用like '%蘇三'進(jìn)行模糊查詢的時(shí)候,再加上條件 name <> '蘇三'。將查出的結(jié)果,從第二個(gè)位置往后放。

這樣可以拼接出你想要的集合。

但有個(gè)缺點(diǎn),就是代碼耦合性太大了。

(3)方案3

之前,品牌蘇三在第二頁,最根本的原因是使用了edit_time字段進(jìn)行逆序的。

也就是說,修改時(shí)間越大的越排在前面,而品牌蘇三的修改時(shí)間很小,所以排在第二頁了。

如果想品牌蘇三,排在第一頁,修改一下排序規(guī)則,不就搞定了?

可以改成按:id或者name字段排序。

用id字段排序,不太合適,雖說用了雪花算法,但跟修改時(shí)間類似,先插入的數(shù)據(jù),會(huì)越小。

select * from brand where name like '%蘇三%' 
order by id desc limit 5;

用它排序的結(jié)果,跟使用修改時(shí)間排序差不了太多。

圖片

看來,只能使用name字段排序了。

3、如何排序?

我們?cè)趕ql中直接對(duì)name字段,進(jìn)行升序或者降序嗎?

顯然不是。

使用name字段降序:

select * from brand where name like '%蘇三%' 
order by name desc limit 5;

執(zhí)行結(jié)果:

圖片

圖中并沒有看到我們想要的數(shù)據(jù)。

其實(shí),使用name字段升序,也可能在第一頁查不出我們所想要的數(shù)據(jù)。

到底該如何處理呢?

假如,我們有這樣一種排序:

  1. 全匹配顯示在最前面,比如:蘇三。
  2. 數(shù)據(jù)左半部分匹配,右邊按字母排序,比如:蘇三1、蘇三2、蘇三說技術(shù)。
  3. 從中間開始匹配,比如:1蘇三、2蘇三。
  4. 第2步和第3步,還要根據(jù)字符長(zhǎng)度排序,字符短的排在前面,比如:1蘇三、1蘇三1、蘇三說技術(shù)。

如果我們能實(shí)現(xiàn)上面的這種排序方式,這個(gè)問題就能完美解決了。

說起來容易,做起來難。

難道要先全匹配:name='蘇三',再有匹配:name like '蘇三%',再左匹配:name like '%蘇三',把查詢?nèi)蔚慕Y(jié)果組裝起來?

顯然這種做法有點(diǎn)low。

要實(shí)現(xiàn)上面我們?cè)O(shè)想的排序方式,在es中更好處理一下,但在mysql中要怎么處理呢?

4、解決方案

其實(shí),我們可以換一種思路,根據(jù)字符的長(zhǎng)度排序。

mysql給我們提供了很多非常有用的函數(shù),比如:char_length。

通過該函數(shù)就能獲取字符長(zhǎng)度。

sql調(diào)整如下:

select * from brand where name like '%蘇三%' 
order by char_length(name) asc limit 5;

name字段使用關(guān)鍵字模糊查詢之后,再使用char_length函數(shù),獲取name字段的字符長(zhǎng)度,然后按長(zhǎng)度升序。

僅這一個(gè)騷操作,就搞定需求了:

圖片

我們所期待的:蘇三,終于排在第一個(gè)了。同時(shí)由于該sql做了分頁的,即使name字段在查詢時(shí)丟失了索引,執(zhí)行效率也不會(huì)太低。

業(yè)務(wù)上的需求搞定了。

但追求完美的我們,好奇,想看看第二頁是什么情況:

select * from brand where name like '%蘇三%' 
order by char_length(name) asc limit 5,5;

執(zhí)行結(jié)果:

圖片

并沒有按照我們?cè)O(shè)想的劇本進(jìn)行下去,我們之前假設(shè)的3條排序中,第2條和第3條都沒有滿足。

這時(shí)該怎么辦?

答:可以使用mysql中的locate函數(shù),通過它可以匹配的關(guān)鍵字,在字符串中的位置。

使用locate函數(shù)改造之后sql如下:

select * from brand where name like '%蘇三%' 
order by char_length(name) asc, locate('蘇三',name) asc limit 5,5;

執(zhí)行結(jié)果:

圖片

完美,終于出現(xiàn)我們想要的結(jié)果了。

除此之外,還可以使用:instr和position函數(shù),它們的功能跟locate函數(shù)類似,在這里我就不一一介紹了,感興趣的小伙伴可以找我私聊。

5、總結(jié)

其實(shí),模糊查詢和分頁,如果分開用,一般是沒問題的。

但如果它們要一起使用,一定要考慮排序問題。

如果只是按照簡(jiǎn)單的時(shí)間或者id排序,有些特殊的業(yè)務(wù)場(chǎng)景,沒辦法滿足,很容易出現(xiàn)bug。

當(dāng)然解決上面問題,還有其他辦法,比如:pageSize調(diào)大一點(diǎn),或者把全匹配放到第一頁。

但更優(yōu)的方案,是通過mysql的函數(shù)來解決問題。

我們可以通過mysql提供的:char_length、locate、instr和position函數(shù)等,來實(shí)現(xiàn)很多復(fù)雜的排序功能。

責(zé)任編輯:姜華 來源: 蘇三說技術(shù)
相關(guān)推薦

2023-04-26 10:21:04

2020-12-24 15:26:07

Redis數(shù)據(jù)庫

2020-10-08 18:58:46

條件變量開發(fā)線程

2022-09-29 12:20:48

CSS容器查詢

2023-04-26 10:06:08

RocketMQ屬性Consumer

2023-09-01 07:38:45

ArrayListArrayst實(shí)線類

2022-06-30 13:41:44

SQL 語句group by

2022-01-09 23:20:50

手機(jī)國(guó)產(chǎn)蘋果

2023-12-07 07:08:09

Angular函數(shù)

2022-03-13 18:53:31

interfacetypeTypeScript

2023-12-20 08:23:53

NIO組件非阻塞

2023-12-12 08:41:01

2024-04-30 09:02:48

2020-11-04 17:35:39

網(wǎng)絡(luò)安全漏洞技術(shù)

2022-06-08 07:34:25

InnoDBdeleteMySQL

2024-05-27 00:00:00

localhostIPv6IPv4

2024-03-26 00:10:08

預(yù)測(cè)AI泛化

2022-08-02 06:55:35

移動(dòng)設(shè)備Android

2022-12-09 19:00:02

Vite兼容性BigInt

2024-04-07 00:00:00

ESlint命令變量
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

日本一区二区三区在线观看| 久久精品人人爽| 黄色成人免费看| 久久99蜜桃精品| 激情久久av| 911精品美国片911久久久| 性色av一区二区三区| 电影一区二区三区久久免费观看| 6080日韩午夜伦伦午夜伦| 人成免费电影一二三区在线观看| 亚洲另类色综合网站| 女性隐私黄www网站视频| 国产传媒日韩欧美成人| 亚洲一区二区三区精品视频| 亚洲专区在线| 久久99蜜桃综合影院免费观看| 91精品1区| 91在线网站视频| 欧美一二区在线观看| 国产精品私拍pans大尺度在线| 国产探花在线精品一区二区| 日本一欧美一欧美一亚洲视频| 日韩在线视频一区二区三区| 久久成人这里只有精品| 精品国产亚洲一区二区三区在线 | 亚洲三级网页| 日本成人激情视频| 天天操夜夜操国产精品| 114国产精品久久免费观看| 国产精品v亚洲精品v日韩精品 | 亚洲高清激情| 免费日韩电影在线观看| 久久久久久穴| 欧美性视频在线播放| 国产精品亚洲视频| 成人在线观看黄| 亚洲精品欧美二区三区中文字幕| 黄页网址在线观看| 在线一区二区三区| 成人超碰在线| 久久久精品网站| 久久av综合| 国产精品99久久久久久久| 久久一二三区| 欧美精品第三页| 午夜视频久久久久久| 日韩激情美女| 欧美高清激情视频| 日韩精品四区| 午夜视频久久久| 久久免费国产精品| 在线碰免费视频在线观看| 欧美一级午夜免费电影| 欧美视频二区欧美影视| 成人久久久久久| 韩国一区二区在线观看| 91看片在线免费观看| 欧美优质美女网站| 色综合天天色| 国产精品久久不能| 蜜桃视频第一区免费观看| 日本超碰在线观看| 欧美一级高清片| 欧美亚洲色图校园春色| 欧美日韩亚洲在线| 国产精品久久精品日日| 色图在线观看| 国产成人一区二区| 国产高清不卡一区二区| 视频国产一区二区三区| 日韩网站免费观看| 激情久久一区| www.夜夜爽| 亚洲国内精品视频| 成人网18免费网站| 国产成a人亚洲精v品在线观看| 亚洲线精品一区二区三区八戒| 欧美激情网站| 亚洲一区国产精品| 久久久99久久精品欧美| 18网站在线观看| 日本aⅴ大伊香蕉精品视频| 激情久久五月天| 久久久资源网| 97视频在线免费观看| 国内精品视频666| 最新av网站在线观看| 欧美在线视频网站| 成人av电影免费在线播放| 久久精品视频免费看| 国产成人短视频| av电影在线观看完整版一区二区| 最新97超碰在线| 国产精品美女主播在线观看纯欲| 丁香婷婷深情五月亚洲| 中文av资源在线| 亚洲最大福利视频网站| 亚洲欧美日韩综合aⅴ视频| 日本在线中文字幕一区二区三区| 久久99影院| 一本久久a久久免费精品不卡| 国产精品115| 99爱视频在线| 在线日韩欧美视频| 美女视频黄久久| 伊人222成人综合网| 国产精品久久久久久久小唯西川 | 国产成人拍精品视频午夜网站| 成人蜜臀av电影| 久久大胆人体| 国产伦精品一区二区三区| 亚洲国产精品久久久男人的天堂 | 亚洲图片欧美| 美女扒开大腿让男人桶| 欧美日本一道本在线视频| 精品国产一区二区三区香蕉沈先生| 俄罗斯av网站| 亚洲精品永久免费精品| 久久精品天堂| 日本免费在线视频| 成人自拍爱视频| 欧美日韩亚洲精品一区二区三区| 尤物tv在线精品| 黄色福利视频网站| 日本在线观看天堂男亚洲| 国产精品久久久久婷婷| 亚洲一区二区三区四区电影| 成人三级视频在线播放| yw.139尤物在线精品视频| 成人动漫在线一区| 国产a亚洲精品| 18禁免费观看网站| 久久影院模特热| 国产精品免费视频观看| 私拍精品福利视频在线一区| www.日本视频| 国产欧美在线视频| 欧美在线影院一区二区| 久久久精品午夜少妇| 久久男人av资源站| 日本福利视频一区| 欧美日本精品在线| 亚洲欧洲综合另类| 亚洲国产精品成人| 激情影院在线观看| 中文字幕一区二区三区最新| 亚洲一二在线观看| 久久日一线二线三线suv| 福利片一区二区| 国产精品精华液网站| 亚洲v日韩v综合v精品v| 欧美一区二区在线播放| 国产一区二区伦理片| 日本精品在线观看| 捆绑紧缚一区二区三区在线观看| 国产精品视频色| 欧美精品第1页| 国产麻豆视频一区| www.爱久久| 免费a级毛片在线观看| 丝袜美腿玉足3d专区一区| 一区二区三区无码高清视频| 国产欧美日韩不卡| 亚洲自拍偷拍网| 桃色av一区二区| 成人免费黄色网址| 国产精品综合久久久久久| 亚洲老司机av| 国产精品久久久久一区 | 日韩va欧美va亚洲va久久| 免费成人美女女| 国外av网站| 欧美精品久久| 久热在线中文字幕色999舞| 亚洲精品国产成人久久av盗摄| 欧美在线网站| 成人做爰视频www网站小优视频| 亚洲黄色av网址| 国产欧美一区二区三区视频| 欧美一区二区精品| www国产精品av| 欧美性色综合| 九九九九九九精品任你躁| 精品999视频| 人妻夜夜添夜夜无码av | 91精品国产综合久久国产大片| 99国产精品视频免费观看| 天天射综合网视频| 国精产品一区二区三区有限公司| 婷婷六月天丁香| 中国人体摄影一区二区三区| 57pao成人永久免费视频| 欧美一级二级三级乱码| 国产精品伦理在线| 美腿丝袜亚洲色图| 欧美熟乱15p| 电影久久久久久| 在线免费观看黄色网址| 日韩精品一区二区三区色欲av| 久久久久九九九|