select 学生,学科,成绩 from( SELECT CASE WHEN @学科 != 学科 THEN @dense_rank:= 1 WHEN @成绩 = 成绩 THEN @dense_rank ELSE @dense_rank:= @dense_rank + 1 END AS DENSE_RANK, 学生, @学科 :=学科 AS 学科, @成绩 := 成绩 AS 成绩 FROM (SELECT @学科:='') k, (SELECT @成绩:=0) v, (SELECT @dense_rank:=0) d, 表名 main ORDER BY 学科,成绩 desc)t where t.DENSE_RANK<=2
为啥 我有个表 t_score 给 score字段加索引了select * from t_score where score>100; 可以用到索引select * from t_score where score<90; 用不上索引呢 score的范围是 1-100
SELECT
CASE
WHEN @学科 != 学科 THEN @dense_rank:= 1
WHEN @成绩 = 成绩 THEN @dense_rank
ELSE @dense_rank:= @dense_rank + 1
END AS DENSE_RANK,
学生,
@学科 :=学科 AS 学科,
@成绩 := 成绩 AS 成绩
FROM
(SELECT @学科:='') k,
(SELECT @成绩:=0) v,
(SELECT @dense_rank:=0) d,
表名 main
ORDER BY
学科,成绩 desc)t where t.DENSE_RANK<=2
score的范围是 1-100