mysql 加序號以及成績單排名的幾種實現方式

2021-09-03 02:24:38 字數 3763 閱讀 2360

首先   我們新建乙個表,表資訊如下:

create table `report` (

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

`score` int(4) default null comment '分數',

`user_name` varchar(255) default null comment '姓名',

`exam_time` time default null comment '考試時間',

primary key (`id`)

) engine=innodb auto_increment=6 default charset=utf8 comment='成績表';

假如是一般的排序 ,那我們直接按照分數降序排序,select * from report order by score desc;

查出來乙個list,list的索引就當做它的排名(當然是索引+1)。

或者直接用sql,在sql裡標明排名序號:

select

@rownum := @rownum + 1 as rownum,

r.*from

report r,

(select @rownum := 0) b

order by

score desc

上面的@方式是mysql定義變數的方式,用:=進行賦值。

這兩種方法都是簡單的進行降序排序,然後加上序號,顯然很low,也不符合需求。

一般的成績單呢,應該是分數相同的,排名一致,以此類推。所以,我們給出三種查詢方式:

方式一:借助建立偽表,比較大小並排序

select

count(b.user_name) + 1 as rk,

a.*from

report a

left join report b on a.score < b.score

group by

a.user_name

order by

count(b.user_name) + 1;

方式二: 借助於if函式判斷以及自定義方式

select 

@rownum:=@rownum+1 as rownum,

if(@score=a.score,@rank,@rank:=@rownum)as rank,

@score:=a.score,

a.user_name,a.score,a.exam_time

from

(select * from report order by score desc) a,

(select @rank:=0,@rownum:=0,@score:=null)b

方式三:借助case when函式判斷:

select 

count(case when a.score < b.score then b.user_name else null end)+1 as rank,

a.user_name,a.score,a.exam_time

from report a

left join report b

on 1=1

group by a.user_name,a.score,a.exam_time

order by rank

以上三種方式的結果大概意思是這樣:如下圖

到此   成績單的排序,就基本滿足普通的需求了。

由於博主本人又遇到了新需求,對於一些小測驗啥的,要求,分數一樣的,按時間長短排序,分數時間都一樣,排名形同。

這樣的話,其實就是對以上三種方法再加些判斷條件。

對於第一種的話,就稍微複雜一點。如下:

方式a:

這樣的寫法,乍一看,**有點多,那麼對於用函式的,怎麼查詢呢?

方式b:

select 

@rownum:=@rownum+1 as rownum,

if((@score=a.score && @exam_time=a.exam_time),@rank,@rank:=@rownum)as rank,

@score:=a.score,@exam_time:=a.exam_time,

a.user_name

from

(select * from report order by score desc,exam_time asc

) a,

(select @rank:=0,@rownum:=0,@score:=null,@exam_time:=null)b

這個方法的結果如下圖:

那麼 ,假如想要查詢某個人的資訊以及排名呢,所有人的都查出來了,查某個人的,就加個判斷條件啦

select c.*

from

(select

@rownum:=@rownum+1 as rownum,

if(@score=a.score,@rank,@rank:=@rownum)as rank,

@score:=a.score,

a.user_name,a.score,a.exam_time

from

(select * from report order by score desc) a,

(select @rank:=0,@rownum:=0,@score:=null)b

) c where c.user_name ='lisi'

以上。

成績單型別

cjd 雙單引號是注釋 成績單學號 d20c055 s s是字串輸出 你的成績如下 高等數學 f分 f是浮點數輸出,f前加數字幾就保留幾位 python程式設計基礎 f分 形勢與政策 f分 大學英語 f分 xuehao input 請輸入數字 sc float input 請輸入高等數學分數 py ...

成績單問題

今天羅浮宮群的乙個同學問了個成績單的問題。以前我也遇到過,當時記得費了好大勁。現在正好回味一番。資料庫結構如下。資料插入語句如下。create table if not exists chengji goods id int 5 not null,user id int 5 not null,poi...

Bugku 成績單 有感

題目位址 因為個人是個小白,看到題目毫無頭緒。在網上搜到wp,參考著得以理解。這個題目需要手動爆破資料庫的 庫名 表名 列名 內容。庫名 用資料庫聯合查詢語句 id 1 union select 1,2,3,database 得到資料庫名字skctf flag 表名 id 1 union selec...