MySQL根据某字段分组(group by)之后再根据另外的字段排序(order by)

Posted 爱锅巴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL根据某字段分组(group by)之后再根据另外的字段排序(order by)相关的知识,希望对你有一定的参考价值。

表数据

user_score表数据如下,是一张记录人名、成绩和科目对应的表

mysql> select * from user_score;
+----+--------+-------+---------+
| id | name   | score | course  |
+----+--------+-------+---------+
|  1 | 张三 	  | 93    | 语文 	|
|  2 | 李四	  | 96    | 语文 	|
|  3 | 张三	  | 88    | 数学 	|
|  4 | 李四	  | 85    | 数学 	|
|  5 | 王五	  | 88    | 数学 	|
+----+--------+-------+---------+
需求:查询每门课的最高成绩和人
SELECT u.* FROM user_score u,
(SELECT max( score ) max_score, course 
FROM user_score GROUP BY course) t 
WHERE u.course = t.course AND u.score = t.max_score

或者使用关联查询,在表数据量大的时候join(inner join和join是一样的)查询有优势

SELECT u.* FROM user_score u INNER JOIN
(SELECT max( score ) max_score, course 
FROM user_score GROUP BY course) t 
ON u.course = t.course AND u.score = t.max_score
查询结果:
+----+--------+-------+---------+
| id | name   | score | course  |
+----+--------+-------+---------+
|  2 | 李四	  | 96    | 语文 	|
|  3 | 张三	  | 88    | 数学 	|
|  5 | 王五	  | 88    | 数学 	|
+----+--------+-------+---------+
分析:

如果要查所有课程的最好成绩那么首先需要根据课程分组(group by),然后找出最好成绩,可能会想到用max之类的函数,如果单纯查询每门课的最高成绩,不用列出其他字段(例如name)的话这样做是没问题的,但是需要其他字段这样查询就会有问题

以上是关于MySQL根据某字段分组(group by)之后再根据另外的字段排序(order by)的主要内容,如果未能解决你的问题,请参考以下文章

mysql:group by,order by

MYsql5.7版本之后,用group by查询不在分组字段遇到的坑

mysql5.7 group by语法 1055

mysql group by limit (根据某一分组,取固定条数) 实现

mysql 可以group by 两个字段吗

MySql - GROUP BY 和 HAVING关键字