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)的话这样做是没问题的,但是需要其他字段这样查询就会有问题

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值