1.建立表並寫入測試資料
create table tb_rank_score
city varchar(20),
score int
insert into tb_rank_score values('sz',89);
insert into tb_rank_score values('sz',76);
insert into tb_rank_score values('sz',50);
insert into tb_rank_score values('sz',89);
insert into tb_rank_score values('sz',78);
insert into tb_rank_score values('sh',90);
insert into tb_rank_score values('sh',34);
insert into tb_rank_score values('sh',78);
insert into tb_rank_score values('sh',67);
insert into tb_rank_score values('sh',76);
2.普通排名:從1開始,順序往下排
mysql> select tb_rank_score.*,@r :=@r + 1 as rank
-> from tb_rank_score,(select @r := 0) r
-> order by score desc;
| city | score | rank |
| sh | 90 | 1 |
| sz | 89 | 2 |
| sz | 89 | 3 |
| sz | 78 | 4 |
| sh | 78 | 5 |
| sz | 76 | 6 |
| sh | 76 | 7 |
| sh | 67 | 8 |
| sz | 50 | 9 |
| sh | 34 | 10 |
10 rows in set (0.00 sec)
3.並列排名:相同的值是相同的排名
mysql> select tb_rank_score.* ,
-> case
-> when @p=score then @r
-> when @p:=score then @r:=@r+1
-> end rank
-> from tb_rank_score,(select @r:=0,@p:=null)r
-> order by score desc;
| city | score | rank |
| sh | 90 | 1 |
| sz | 89 | 2 |
| sz | 89 | 2 |
| sz | 78 | 3 |
| sh | 78 | 3 |
| sz | 76 | 4 |
| sh | 76 | 4 |
| sh | 67 | 5 |
| sz | 50 | 6 |
| sh | 34 | 7 |
10 rows in set (0.00 sec)
4.分組後組內排名
mysql> select city,score,rank
-> from
-> select tb_rank_score.*,if(@p=city,@r:=@r+1,@r:=1) as rank,
-> @p:=city
-> from tb_rank_score,(select @p:=null,@r:=0)r
-> order by city,score desc
-> )s;
| city | score | rank |
| sh | 90 | 1 |
| sh | 78 | 2 |
| sh | 76 | 3 |
| sh | 67 | 4 |
| sh | 34 | 5 |
| sz | 89 | 1 |
| sz | 89 | 2 |
| sz | 78 | 3 |
| sz | 76 | 4 |
| sz | 50 | 5 |
10 rows in set (0.00 sec)
5.分組後並列排名:組內相同數值排名相同
mysql> select city,score,rank
-> from
-> select *,
-> if(@p=city,
-> case
-> when @s=score then @r
-> when @s:=score then @r:=@r+1
-> end,
-> @r:=1 ) as rank,
-> @p:=city,
-> @s:=score
-> from tb_rank_score,(select @p:=null,@s:=null,@r:=0)r
-> order by city,score desc
-> )s;
| city | score | rank |
| sh | 90 | 1 |
| sh | 78 | 2 |
| sh | 76 | 3 |
| sh | 67 | 4 |
| sh | 34 | 5 |
| sz | 89 | 1 |
| sz | 89 | 1 |
| sz | 78 | 2 |
| sz | 76 | 3 |
| sz | 50 | 4 |
10 rows in set (0.00 sec)
6.分組後取各組的前三名
mysql> select city,score,rank
-> from
-> select *,
-> if(@p=city,
-> case
-> when @s=score then @r
-> when @s:=score then @r:=@r+1
-> end,
-> @r:=1 ) as rank,
-> @p:=city,
-> @s:=score
-> from tb_rank_score,(select @p:=null,@s:=null,@r:=0)r
-> order by city,score desc
-> )s
-> where rank <4;
| city | score | rank |
| sh | 90 | 1 |
| sh | 78 | 2 |
| sh | 76 | 3 |
| sz | 89 | 1 |
| sz | 89 | 1 |
| sz | 78 | 2 |
| sz | 76 | 3 |
7 rows in set (0.00 sec)
mysql 控制分組個數 MYSQL 按限制分組
有沒有一種簡單的方法可以將group by結果限制在前2位。以下查詢返回所有結果。使用 limit 2 將整個列表減少到僅前2個條目。select distinct rating name id markets,sum rating good good sum rating neutral neut...
mysql 隨機分組 Mysql 分組選擇
mysql 分組選擇與group concat 在其他的資料庫中我們遇到分組選擇的問題時,比如在分組中計算前10名的平均分 我們可以使用row number over 比較方便的得到。但是在mysql中,問題就被拋了出來,因為mysql並沒有乙個rownum內建資料元組訪問方式。在這裡我提供三種方式...
mysql 排名 MySQL用變數實現排名
mysql 8.0版本用視窗函式就可以實現排名,有三種方式,對相同值的處理不同 以上區別會在文末舉例,本文主要討論用變數實現排名 5.5版本用不了視窗函式 至少排序視窗用不了,其他的沒試過 那麼對於要顯示排名的需求就得想其他辦法啦,看網上的資料可以用變數來實現,來看看 首先建表並插入資料 資料資料來...