MySQL SQL語句實現簡單的排名功能

2021-06-25 20:39:13 字數 2658 閱讀 5100

最近在csdn論壇上看到,有人問怎麼在mysql中加排名,因此自己也思考了一下。下面記錄一下,

自己的解決方法與大家分享。可能不是最好的方法,如果大家有更好的方法大家一起交流一下,謝謝~

目前有乙個表tb_rank(playerid,playername,score) playerid是primary key(主鍵);

現在的需求是,希望在表tb_rank中再新增一列ranknum,這個ranknum記錄的是score的排名

(根據分數做降序排列)。

問題分析

經過分析,我們可以將此問題大概分解為以下三個子問題:

(1) 在表tb_rank中增加一列ranknum;

alter table tb_rank add ranknum int;
(2)對錶tb_rank中的score列進行降序排名,且將排名數值增加到被排序的元組中;初次執行排序可以使用:

select playerid,playername,score,(@rank:=ifnull(@rank,0)+1) ranknum 

from tb_rank

order by score desc

普遍使用的排序sql為

set @rank:=0;

select playerid,playername,score,(@rank:=@rank+1) ranknum

from tb_rank

order by score desc

(3)用第2步的結果來更新新增列ranknum的值。

set @rank:=0;

update tb_rank,(select playerid,( @rank:=@rank+1) ranknum from tb_rank order by score desc) temp_tb_rank

set tb_rank.ranknum=temp_tb_rank.ranknum

where tb_rank.playerid=temp_tb_rank.playerid;

排名的tb_rank表查詢返回的結果為

到此就實現了簡單的排名了。但是這裡存在乙個問題,就是說當score相同的時候,

比如:playerid是』12『和』13『以及』123456『,它們的score都是1000,

但是查詢出來的結果在排名上的呈現卻不一致。

這個是不合理的。下面第3節介紹一種解決方法。

實現思路

產生第二步中同樣的分數出現不同的排名的問題,其根因是排名實現沒有考慮分數相同的情況,

下面增加乙個變數@prescore來儲存產生當前元組時,上乙個元組的分數;然後在生成排名的列,

根據當前元組的分數與上乙個元組的分數大小進行比較,如果相等,那麼排名不變,否則排名加1。

編寫sql語句需要注意一點,對變數@prescore的賦值需要放到排名列ranknum之後,

要讓其先生成排名,而後才可以更新@prescore變數。

(從sql語句的結果生成原理上看,select語句中,寫在前面的列值是先生成,

寫在後面的列值是後得到的。例如,下面的select語句中,

playerid的位置放在最前面,那麼實際返回查詢結果的時候,是先獲取playerid的值的。)

set @rank:=0;

set @prescore:=0;

select playerid,( if( @prescore<>score,@rank:=@rank+1,@rank ) ) ranknum,@prescore:=score from tb_rank order by score desc

最後合成後的sql語句為

set @rank:=0;

set @prescore:=0;

update tb_rank, (select playerid,( if( @prescore<>score,@rank:=@rank+1,@rank ) ) ranknum,@prescore:=score

from tb_rank

order by score desc) temp_tb_rank

set tb_rank.ranknum=temp_tb_rank.ranknum

where tb_rank.playerid=temp_tb_rank.playerid;

執行後的查詢tb_rank後得到的結果是

這個更符合實際情況些。

MySql Sql語句總結

建表語句 create table class id int primary key,class char 255 name varchar 4000 hobby text int 和 integer 是一樣的,只是為了簡寫罷了,主鍵宣告直接跟在定義後面,char和varchar char是固定長度...

MySQL SQL語句優化

檢視表定義 show create table users 檢視表的索引 show index from users 你要獲取第乙個表的所有資訊,你說全表掃瞄快呢還是索引掃瞄快呢?所以當你查詢庫 包括left join中的臨時庫 的所有資訊時,資料庫會選擇最優方法 全表掃瞄!s表dept id na...

MySQL sql語句筆記

sql 插入insert into 表名 列名 values 值列表 關鍵字 可省略 insert into stu name,age,city values 18,1 更新 update 表名 set 列名 更新值 where 更新條件 update stu set name sdfsdf age...