SELECT 字段1,字段2,new_rank as rank from
(SELECT 字段1,字段2,
IF(@tmp=字段1,@rank:=@rank + 1,@rank:=1) as new_rank,
@tmp:=字段1 as tmp
FROM 表名
ORDER BY 字段1 DESC) b
where new_rank <= n;

 

逻辑说明:

根据分组字段排序

排序过程中将分组字段的值赋给变量@tmp(如果分组条件是多个字段,则@tmp也需要对应多个变量),然后通过if函数比对来排序

注意:@tmp:=字段1 as tmp 赋值操作需要放在右边,即if函数的右边,因为mysql语句编译有从右到左的特性。