一つのテーブルで単純に順位を決めるだけなら色々ググってもでてきますが、
ある項目でグルーピングして順位を決めるものがなかなかなかったのでメモしておきます。
oracleならrank関数一択なんですがmysqlになかったので。。。
下記は3位までです。
select
*
from 対象テーブル a
, (
select
(select @R:=IF(@C=種別列名, @R+1 ,1) from (select @R:=0) as rank_dummy) as rank
, (select @C:=`種別列名` 種別列名 from (select @C:=0) as cate_dummy) as cate
, プライマリキー(結合用)
, 種別列名
from 対象テーブル
order by 種別列名 asc
,ランキング対象列 asc) b
where b.rank <=3
and b.プライマリキー = a.プライマリキー
ascは昇順時 descに切り替えも可能