多個字段排序分頁問題(CASE WHEN)

一.問題背景

最近在開發(fā)項(xiàng)目的時候禾锤,遇到了一個比較棘手的排序問題,在我的訂單列表中查看我的訂單摹察,產(chǎn)品要求按照先按照等級進(jìn)行排序恩掷,等級相同的情況下,按照時間倒序進(jìn)行排序供嚎。
假設(shè)表數(shù)據(jù)部分字段如下:

id,pin,type,cerat_time

其中pin上建了索引黄娘,type表示訂單的類型(已提交,已使用克滴,已取消逼争,已退款)等,暫定這四種狀態(tài)劝赔∈慕梗看到這里,大家肯定想着帽,按照簡單的排序不久行了杂伟,如下:

select id,type,create_time where pin = #{pin} order by type ,create_time desc

對吧移层,很簡單吧。但是需求是已提交=已使用>已取消=已退款稿壁,并且訂單創(chuàng)建的時間并不是順序的幽钢,是打亂的,這時候應(yīng)該怎么辦傅是?

二匪燕、解決辦法

1 集合排序

首先想到的就是绍绘,全部都查出來桂塞,然后在JVM內(nèi)存里面進(jìn)行集合排序操作候生,看起來很符合邏輯肠牲,但是深入一思考齿诞,因?yàn)檫@個涉及到數(shù)據(jù)庫的分頁操作迟隅,如果這么做啼止,你需要每次都把數(shù)據(jù)都取出來放在內(nèi)存中操作卸勺,然后在進(jìn)行集合截取浆劲,有點(diǎn)太麻煩了嫌术,并且,這種方法隨著數(shù)據(jù)量的增加牌借,性能消耗非常大度气,所以這種方案不合適。

2 添加字段

在數(shù)據(jù)表中加一個字段膨报,字段表示業(yè)務(wù)規(guī)定的級別磷籍,然后利用數(shù)據(jù)庫的排序語句就行,其實(shí)這種方案短期來說现柠,應(yīng)該算合適的方案院领,并且隨著數(shù)據(jù)量的增大,在性能方面也還可以扛得住够吩,但是唯一的缺點(diǎn)就是拓展性比較差比然,如果產(chǎn)品給你重新定一種順序你就傻了,除非你重新刷歷史數(shù)據(jù)废恋,更新你這個字段的值谈秫,刷數(shù)據(jù)有點(diǎn)小麻煩,但是這種方案是可行的哈鱼鼓。

3 sql語句解決

第二種方法相當(dāng)于采取了一種曲線的方式去解決拟烫,那么能不能用sql去直接按照這種規(guī)則去排序呢,雖然說看起來有點(diǎn)復(fù)雜迄本,但肯定是有的硕淑,它就是 CASE WHEN

CASE WHEN type in (1,2)
THEN 1
WHEN type in (3,4)
THEN 2
ELSE 3 END type_copy

這SQL語句的意思就是什么呢,當(dāng)type為1和2的時候,認(rèn)為是1等級置媳,當(dāng)type為3和4的時候于樟,認(rèn)為是2等級,然后按照這個進(jìn)行排序不久可以了嘛拇囊,如果需求要換迂曲,你把這個表達(dá)式給改一下不就得了嘛,對吧寥袭。
CASE WHEN THEN 簡單點(diǎn)說路捧,就像單于if else語句嘛,不同的情況進(jìn)行不同的賦值传黄,那么完整的SQL語句如下:

SELECT * FROM 
(SELECT  id,type,create_time,
CASE WHEN type in (1,2)
THEN 1
WHEN type in (3,4)
THEN 2
ELSE 3 END type_copy
from table_name)
where pin=#{pin} order by type_copy,create_time desc limit 0,10;

三 問題延伸

但是杰扫,這還是有個問題,如果數(shù)據(jù)量超過千萬膘掰,這會不會造成數(shù)據(jù)庫慢查章姓,形成性能瓶頸,并且這種直接面向客戶的話识埋,如果高并發(fā)凡伊,直接撈庫肯定是不行,容易直接崩(目前項(xiàng)目數(shù)據(jù)量和并發(fā)不大窒舟,方案并不考慮這個方面)窗声,這種情況,放在Redis中把辜纲,也不是太合適,存起來不太好存拦耐。
最后考慮耕腾,可以把數(shù)據(jù)放在ES進(jìn)行操作,利用ES的聚合能力進(jìn)行排序杀糯,應(yīng)該很容易的解決扫俺,
但是這還得考慮數(shù)據(jù)量大小,如果數(shù)據(jù)量幾十萬左右還是不要用ES固翰,性能和Mysql差不太多狼纬,還麻煩,當(dāng)數(shù)據(jù)量達(dá)到百萬級別的規(guī)模上骂际,就需要考慮ES了疗琉!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市歉铝,隨后出現(xiàn)的幾起案子盈简,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柠贤,死亡現(xiàn)場離奇詭異香浩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)臼勉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門邻吭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人宴霸,你說我怎么就攤上這事囱晴。” “怎么了猖败?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵速缆,是天一觀的道長。 經(jīng)常有香客問我恩闻,道長艺糜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任幢尚,我火速辦了婚禮破停,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘尉剩。我一直安慰自己真慢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布理茎。 她就那樣靜靜地躺著黑界,像睡著了一般。 火紅的嫁衣襯著肌膚如雪皂林。 梳的紋絲不亂的頭發(fā)上朗鸠,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天,我揣著相機(jī)與錄音础倍,去河邊找鬼烛占。 笑死,一個胖子當(dāng)著我的面吹牛沟启,可吹牛的內(nèi)容都是我干的忆家。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼德迹,長吁一口氣:“原來是場噩夢啊……” “哼芽卿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起浦辨,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蹬竖,失蹤者是張志新(化名)和其女友劉穎沼沈,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體币厕,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡列另,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了旦装。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片页衙。...
    茶點(diǎn)故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖阴绢,靈堂內(nèi)的尸體忽然破棺而出店乐,到底是詐尸還是另有隱情,我是刑警寧澤呻袭,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布眨八,位于F島的核電站,受9級特大地震影響左电,放射性物質(zhì)發(fā)生泄漏廉侧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一篓足、第九天 我趴在偏房一處隱蔽的房頂上張望段誊。 院中可真熱鬧,春花似錦栈拖、人聲如沸连舍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽索赏。三九已至,卻和暖如春贴彼,著一層夾襖步出監(jiān)牢的瞬間参滴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工锻弓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蝌箍。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓青灼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親妓盲。 傳聞我的和親對象是個殘疾皇子杂拨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容