mysql查詢排行榜 mysql 查詢排名

2021-10-18 11:36:24 字數 3391 閱讀 1158

sql語句查詢排名

思路:有點類似迴圈裡面的自增一樣,設定乙個變數並賦予初始值,迴圈一次自增加1,從而實現排序;

mysql裡則是需要先將資料查詢出來並先行按照需要排序的字段做好降序desc,或則公升序asc,設定好排序的變數(初始值為0):

a>.將已經排序好的資料從第一條依次取出來,取一條就自增加一,實現從1到最後的乙個排名

b>.當出現相同的資料時,排名保持不變,此時則需要再設定乙個變數,用來記錄上一條資料的值,跟當前資料的值進行對比,如果相同,則排名不變,不相同則排名自增加1

c.當出現相同的資料時,排名保持不變,但是保持不變的排名依舊會占用乙個位置,也就是類似於(1,2,2,2,5)這種排名就是屬於中間的三個排名是一樣的,但是第五個排名按照上面一種情況是(1,2,2,2,3),現在則是排名相同也會佔據排名的位置

準備資料(使用者id,分數):

create table `sql_rank` (

`id` int(11) unsigned not null auto_increment,

`user_id` int(11) unsigned not null,

`score` tinyint(3) unsigned not null,

`add_time` date not null,

primary key (`id`)

) engine=innodb default charset=latin1;

插入資料:

insert into sql_rank (user_id, score, add_time)

values

(100, 50, '2016-05-01'),

(101, 30, '2016-05-01'),

(102, 20, '2016-05-01'),

(103, 60, '2016-05-01'),

(104, 80, '2016-05-01'),

(105, 50, '2016-05-01'),

(106, 70, '2016-05-01'),

(107, 85, '2016-05-01'),

(108, 60, '2016-05-01')

當前資料庫資料:

一、sql1{不管資料相同與否,排名依次排序(1,2,3,4,5,6,7.....)}

select

obj.user_id,obj.score,@rownum := @rownum + 1 as rownum

from

select

user_id,

score

from

`sql_rank`

order by

score desc

) as obj,

(select @rownum := 0) r

執行的結果如下圖:

可以看到,現在按照分數從1到9都排好序了,但是有些分數相同的使用者排名卻不一樣,這就是接下來要說的第二種sql

二、sql2{只要資料有相同的排名就一樣,排名依次排序(1,2,2,3,3,4,5.....)}

select

obj.user_id,

obj.score,

case

when @rowtotal = obj.score then

@rownum

when @rowtotal := obj.score then

@rownum :=@rownum + 1

when @rowtotal = 0 then

@rownum :=@rownum + 1

end as rownum

from

select

user_id,

score

from

`sql_rank`

order by

score desc

) as obj,

(select @rownum := 0 ,@rowtotal := null) r

這時候就新增加了乙個變數,用於記錄上一條資料的分數了,只要當前資料分數跟上一條資料的分數比較,相同分數的排名就不變,不相同分數的排名就加一,並且更新變數的分數值為該條資料的分數,依次比較

如下圖結果:

跟第一條sql的結果相對比你會發現,分數相同的排名也相同,並且最後一名的名次由第9名變成了第7名;

如果你需要分數相同的排名也相同,但是後面的排名不能受到分數相同排名相同而不佔位的影響,也就是哪怕你排名相同,你也佔了這個位置(比如:1,2,2,4,5,5,7....這種形式的,雖然排名有相同,但是你佔位了,後續的排名根據佔位來排)

三、sql2{只要資料有相同的排名就一樣,但是相同排名也佔位,排名依次排序(1,2,2,4,5,5,7.....)}

此時需呀再增加乙個變數,來記錄排序的號碼(自增)

select

obj_new.user_id,

obj_new.score,

obj_new.rownum

from

select

obj.user_id,

obj.score,

@rownum := @rownum + 1 as num_tmp,

@incrnum := case

when @rowtotal = obj.score then

@incrnum

when @rowtotal := obj.score then

@rownum

end as rownum

from

select

user_id,

score

from

`sql_rank`

order by

score desc

) as obj,

select

@rownum := 0 ,@rowtotal := null ,@incrnum := 0

) r) as obj_new

上面sql執行的結果如下:

結果集中分數相同的,排名相同,同時它也佔據了那個位置,中間的乙個資料過程本人截圖了,請往下看(跟上圖做對比你就明白了):

mysql製作排行榜 mysql實現排行榜

博主新人一枚,大家可以提出自己的寶貴意見。下來我們進入正題。大家首先要了解介面的場景,再就是排行榜的規則,我們這裡說的中國式排行榜。排行榜總結了一下分為3種 中國式排行 非中國式排行1 非中國式排行2 1 1 1 2 2 2 2 2 3 3 4 4 3 5 5 4 5 6 5 7 7 select ...

mysql 實現排行榜 mysql之排名實現

前言 mysql沒有實現類似排名 rank 功能的函式。但是我們可以通過基數的查詢加上其他函式可是實現類似的功能。題目 編寫乙個 sql 查詢來實現分數排名。一 首先我們建立一張並插入一些資料如下,用於方便後面排名的演示。create table players pid int 2 not null...

奧運排行榜

每年奧運會各大 都會公布乙個排行榜,但是細心的讀者發現,不同國家的排行榜略有不同。比如中國金牌總數列第一的時候,中國 就公布 金牌榜 而美國的獎牌總數第一,於是美國 就公布 獎牌榜 如果人口少的國家公布乙個 國民人均獎牌榜 說不定非洲的國家會成為榜魁 現在就請你寫乙個程式,對每個前來諮詢的國家按照對...