1. 程式人生 > 實用技巧 >由於row_number() over 是Oracle中的函式,MySQL如何實現相同功能?

由於row_number() over 是Oracle中的函式,MySQL如何實現相同功能?

示例:想要取出每個課程前3名的學生資訊、課程id,成績與對應課程內排名

建立student表:
s_id為學生id,s_name為學生姓名,s_sex為性別
建立score表:
s_id 為學生id,c_id為課程id,s_score為對應的成績

#內嵌部分:
set @rank:=0;
select *, @rank:=case when @current_id<>c_id then 1 else @rank+1 end as rank,
       @current_id:=c_id
from score 
order by c_id, s_score desc;
注意:@current_id=c_id,當c_id不是當前的課程時,rank重新從1開始計數,否則在當前rank上加1,@current_id賦值次序不能錯,第一個正好未賦值,case when @current_id<>c_id 成立then 1執行
此時的排序需要現基於課程id,再基於成績逆序
#整體連起來寫:
set @rank:=0;
select a.*, b.c_id, b.s_score, b.rank 
from(select *, @rank:=case when @current_id<>c_id then 1 else @rank+1 end as rank, @current_id:=c_id 
     from score 
     order by c_id,s_score desc)b
left join student a 
on a.s_id=b.s_id
having rank<=3
order by c_id, rank


注意:在最後的條件設定中需要用having不能用where,因為在原表中是不存在rank欄位的,這是我們為了取數所構造的