由於row_number() over 是Oracle中的函式,MySQL如何實現相同功能?
阿新 • • 發佈:2020-08-11
示例:想要取出每個課程前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執行#整體連起來寫: 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欄位的,這是我們為了取數所構造的