首先 我們新建乙個表,表資訊如下:
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...