對應的mysql語句為:
select personid, totalscore,personname,
if(@de > totalscore, @rank:=@rank+@num+1, @rank) rank,
if(@de = totalscore, @num:=@num, @num:=0),
@de:=totalscore from(
select @de:=0, @rank:=1, @num:=0,personname,personid,sum(score) totalscore
from person
group by personid,personname order by totalscore desc) tmp
執行之後計算出的結果為:
rank為統計排名的名次。
名次有的需求或許不是需要 1 2 2 3形式的排名,而是需要 1 2 2 4
那麼只需要把sql語句改為
select personid, totalscore,personname,
if(@de > totalscore, @rank:=@rank+@num+1, @rank) rank,
if(@de = totalscore, @num:=@num+1, @num:=0),
@de:=totalscore from(
select @de:=0, @rank:=1, @num:=0,personname,personid,sum(score) totalscore
from person
group by personid,personname order by totalscore desc) tmp
即可
結果顯示為:
如果需要給查詢的資料加條件,比如只對personid 為1001,1003的人員進行統計排名:
select personid, totalscore,personname,
if(@de > totalscore, @rank:=@rank+@num+1, @rank) rank,
if(@de = totalscore, @num:=@num, @num:=0),
@de:=totalscore from(
select @de:=0, @rank:=1, @num:=0,personname,personid,sum(score) totalscore
from person where personid in ("1001","1003")
group by personid,personname order by totalscore desc) tmp
結果為:
接下來是統計某人的資料以及排名情況:
select personid, totalscore, personname, rank from (
select personid, totalscore,personname,
if(@de > totalscore, @rank:=@rank+@num+1, @rank) rank,
if(@de = totalscore, @num:=@num, @num:=0),
@de:=totalscore from(
select @de:=0, @rank:=1, @num:=0,personname,personid,sum(score) totalscore
from person
group by personid,personname order by totalscore desc) tmp ) tmp2 where personid="1003"
計算結果為:
如何進行mysql的優化
1 設計表的時候考慮選擇什麼樣的儲存引擎,myisam不之策事務,但查詢速度快,不過現在一般採用的都是inndb,能符合95 的專案需求。2 避免全表查詢的操作。3 在where 和 order by 的字段建立索引。但索引不是越多越好,會使insert 和update 的速度變慢。4 盡量不要採用...
mysql如何進行自動的備份
備份的命令 mysqldump u root password root student home mysql data bak date date y m d h m s sql 首先建立乙個資料夾用來存放備份的資料庫檔案 eg mkdir mysql data bak 建立乙個資料夾 給資料夾付...
如何使用hadoop對海量資料進行統計並排序
b color green size x large 不得不說,hadoop確實是處理海量離線資料的利器,當然,凡是乙個東西有優點必定也有缺點,hadoop的缺點也很多,比如對流式計算,實時計算,dag具有依賴關係的計算,支援都不友好,所以,由此誕生了很多新的分布式計算框架,storm,spark,...