Mysql分类查询问题

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

建表:

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

##子查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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

#自连接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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