mysql給資料做排名 mysql給資料統計做排名

2021-10-19 17:15:25 字數 2215 閱讀 7233

1、問題描述

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

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

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

2、初步解決方法(不考慮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節介紹一種解決方法。

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;

mysql 給現有資料做索引 mysql資料庫索引

mysql索引實現 在mysql中,索引屬於儲存引擎級別的概念,不同儲存引擎對索引的實現方式是不同的,本文主要討論myisam和innodb兩個儲存引擎的索引實現方式。走進搜尋引擎的作者梁斌老師針對b樹 b 樹給出了他的意見 為了真實性,特引用其原話,未作任何改動 b 樹還有乙個最大的好處,方便掃庫...

haproxy給mysql做負載均衡

一 首先安裝haproxy make target linux26 prefix usr local haproxy 將haproxy安裝到 usr local haproxy make install prefix usr local haproxy prefix必須用大寫,否則無法安裝到指定目錄...

手動備份MySQL資料庫 手動備份mysql資料庫

paths 檔案路徑 user 資料庫使用者名稱 pass 資料庫密碼 database 資料庫名 public static boolean backup string paths,string user,string pass,string database outstr sb.tostring...