MySQL分类排名问题

实现对学生按课程依成绩高低进行排序

建表:

CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `course` varchar(20) DEFAULT NULL,
  `score` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

数据:

1   张三  语文  80
2   李四  语文  90
3   王五  语文  93
4   张三  数学  77
5   李四  数学  68
6   王五  数学  99
7   张三  英语  90
8   李四  英语  50
9   王五  英语  89

子查询

SELECT
    *, (
        SELECT
            COUNT(b.score) + 1
        FROM
            test b
        WHERE
            a. NAME = b. NAME
        AND a.score < b.score
    ) AS 'rank'
FROM
    test a
ORDER BY
    NAME,
    rank

查询结果:
7   张三  英语  90  1
1   张三  语文  80  2
4   张三  数学  77  3
2   李四  语文  90  1
5   李四  数学  68  2
8   李四  英语  50  3
6   王五  数学  99  1
3   王五  语文  93  2
9   王五  英语  89  3

自连接

SELECT 
    a.*, COUNT(b.score)+1 AS 'rank'
FROM 
    test a LEFT JOIN test b ON (a.name = b.name  AND a.score < b.score)
GROUP BY 
    a.name, a.score,a.course
ORDER BY 
    a.name, COUNT(b.score) asc

查询结果:
7   张三  英语  90  1
1   张三  语文  80  2
4   张三  数学  77  3
2   李四  语文  90  1
5   李四  数学  68  2
8   李四  英语  50  3
6   王五  数学  99  1
3   王五  语文  93  2
9   王五  英语  89  3

参考:
https://mp.weixin.qq.com/s/s8EiV-oKNR4n9Goe4gIAOw