前提议双,需求的來源是這樣子的:公司業(yè)務(wù)中痘番,我想知道某個(gè)商品,某一個(gè)時(shí)間段的銷量排名平痰,以下通過另外的例子進(jìn)行選擇汞舱。
首先看一張表格
問題:假設(shè)現(xiàn)在你是師傅,你想知道你的id從大到小排序宗雇,id排在所有id中的第幾位“何撸現(xiàn)在數(shù)據(jù)量少,用眼睛就很容易知道了赔蒲,在數(shù)據(jù)大的情況下oracle要得到這個(gè)排序也比較容易说铃,但是在mysql中并不容易。
這上面的表我們可以利用 order by id desc嘹履,很容易得到數(shù)據(jù)對id從大到小的排序。
select @rownum := @rownum + 1 rownum , role_name from (
? ??????select @rownum := 0 , a.role_code , a.role_name from?app_role_copy as a?order by a.id desc?)? t
我認(rèn)為:引用中的斜體為建立的一個(gè)臨時(shí)的表债热,且根據(jù)id排好砾嫉,然后外面的select則把序號rownum賦值好對應(yīng)的序號,其中 t 作為臨時(shí)表的表名不能省略窒篱,所以得到如下的結(jié)果焕刮。
所以已經(jīng)知道了師傅所在的排序。為了只得到師傅排名的結(jié)果配并,所以最后從得到的結(jié)果表按照篩選條件括荡,即可得到最終結(jié)果。
select rownum,role_name from (
? ? ? ? select @rownum := @rownum + 1 rownum , role_name from (
????????????????select?@rownum := 0 , a.role_code , a.role_name?from?app_role_copy as a?order by a.id desc?)? t ) y
where y.role_name ='師傅';
順帶吐槽一下溉旋,上了兩三天的業(yè)務(wù)后畸冲,然后因?yàn)?*,就下掉了。但是作為一個(gè)rank demo是合適的。