MySQL 用gourp by分组后取某一字段最大值、最新数据

  • 一、业务说明
  • 二、问题复现
  • 三、解决办法
    • 1.先取出姓名、最大分数
    • 2.把上面查询的数据作为临时表与原表关联查询

一、业务说明

大家在日常开发中不可避免遇到对某个表分组后取最大值、最新值等业务需求,这就涉及到group by、max函数。 举个例子:

SET FOREIGN_KEY_CHECKS=0;-- ----------------------------
-- Table structure for score
-- ----------------------------
DROP TABLE IF EXISTS `score`;
CREATE TABLE `score` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(36) DEFAULT NULL,`subject` varchar(36) DEFAULT NULL,`score` int(10) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;-- ----------------------------
-- Records of score
-- ----------------------------
INSERT INTO `score` VALUES ('1', '张三', '语文', '92');
INSERT INTO `score` VALUES ('2', '张三', '数学', '100');
INSERT INTO `score` VALUES ('3', '李四', '语文', '95');
INSERT INTO `score` VALUES ('4', '李四', '数学', '75');
INSERT INTO `score` VALUES ('5', '王五', '语文', '85');
INSERT INTO `score` VALUES ('6', '王五', '数学', '96');
INSERT INTO `score` VALUES ('7', '张三', '英语', '99');
INSERT INTO `score` VALUES ('8', '李四', '英语', '76');
INSERT INTO `score` VALUES ('9', '王五', '英语', '99');

这里有个业务:取出每个人的单科最好成绩。

二、问题复现

我个人首先想到的sql是:

select name,subject,max(score) from score group by name

运行结果却是:

大家可以看到,名字和分数没错,但科目却都是语文。显然与实际不符!(group by 默认取第一条数据)

注:
我这里又试了一下先进行排序,再分组取值,但结果还是和上面一样

select temp.name,temp.subject,max(temp.score)
from (select * from score order by score desc) temp
group by temp.name

三、解决办法

1.先取出姓名、最大分数

select name,max(score) from score group by name

2.把上面查询的数据作为临时表与原表关联查询

select temp_b.name,temp_b.subject,temp_b.score
from(select name,max(score) score from score group by name) temp_ainner join score temp_b
on  temp_a.name = temp_b.name and temp_a.score = temp_b.score

最后的结果为:

问题解决,希望可以帮助到大家。如果大家有更好的解决方案,欢迎评论区留言。

MySQL 用gourp by分组后取某一字段最大值相关推荐

  1. mysql分组取所有数据_mysql 分组后取每个组内最新的一条数据

    首先,将按条件查询并排序的结果查询出来. mysql> select accepttime,user,job from tuser_job where user =8 order by acce ...

  2. oracle求一行多列最大值,Oracle分组后取某列最大值的行数据

    select * from ( select last_comment, row_number() over(partition by employeeid,roadline,stationname ...

  3. oracle 取分组第一行,oracle分组后取每组第一条数据

    oracle 分组后取每组第一条数据 '数据格式 分组取第一条的效果 sql SELECT * FROM (SELECT ROW_NUMBER() OVER(PARTITION BY x ORDER ...

  4. 获取分组后取某字段最大一条记录(求每个类别中最大的值的列表)

    获取分组后取某字段最大一条记录 方法一:(效率最高) select * from test as a where typeindex = (select max(b.typeindex) from t ...

  5. java8stream根据对象属性分组后取一个对象

    java8stream根据对象属性分组后取一个对象 实例: Map<String, MltContractDayPower> dayPowerMap = mltContractDayPow ...

  6. JAVA使用stream对数据分组后求每组的最大值

    JAVA stream对数据分组后求每组的最大值 具体需求 对industryCode分组,然后通过取出每组的num的最大值 // 实体类 @Data @AllArgsConstructor publ ...

  7. MySQL分组后取每一组第N条数据

    1.知识点 group_concat()函数:聚合函数 1.功能:将group by产生的同一个分组中的值连接起来,返回一个字符串结果. 2.语法:group_concat( [distinct] 要 ...

  8. mysql分组取出每组地一条数据_MySQL 分组后取每组前N条数据

    与oracle的rownumber() over(partition by xxxorder by xxx)语句类似,即:对表分组后排序 创建测试emp表 DROP TABLE IF EXISTS e ...

  9. MySQL 分组后取最新记录

    业务场景: 取一张表里面最新的一条数据,以最新的一条数据为基准进行相关业务操作. 创建我们需要的测试表 create table my_test (id int auto_incrementprima ...

最新文章

  1. python界面长什么样子-这可能是最好玩的python GUI入门实例(推荐)
  2. 关于MonoBehaviour的单例通用规则
  3. pip配置永久国内源
  4. 【Tools】VMware Workstation 15.5 Pro安装详解
  5. v-if和v-show
  6. 在java面向对象编程中_谈一谈你对封装_继承_多态概念的理解_Java新职篇:面向对象编程的3个原则是什么?...
  7. 115怎么利用sha1下载东西_618“甩”度娘,拥抱115,体验和价格才是王道
  8. OptaPlanner –具有真实道路距离的车辆路线
  9. CListControl的OnMouseMove和OnNcHitTest
  10. mysql 存储过程复杂查询_SQL分页存储过程 支持连接查询等复杂的SQL
  11. sem_timedwait的用法
  12. OpenGL.Superbible.7th.Edition(openGL超级宝典第七版)随书例子运行
  13. 大学学习历程简单总结
  14. 高分子专业计算机建模,高分子与计算机模拟.doc
  15. 现代汉语句子成分分析
  16. 微型计算机鼠标连接,解决无线鼠标重新对码问题
  17. cdlinux 0.9.8_Cdlinux的GNU / Linux发行版0.9.6.1版
  18. Ilog、Drools、Jess规则引擎的Rule Language 比对
  19. 网狐荣耀需要什么服务器系统,网狐荣耀环境搭建教程
  20. c++课程设计日历记事本

热门文章

  1. C# 面向对象程序设计复习
  2. 数据库阻塞---讲解设计应用程序时避免阻塞的八个准则
  3. HDU2189 来生一起走【完全背包】
  4. HDU2002 计算球体积【入门】
  5. Eratosthenes筛选法
  6. gcc/g++ 使用 tricks
  7. Linux 下进入含空格的目录(以及文件夹名开头为`(`)
  8. 机器学习基础(三十二) —— 使用 Apriori 算法进行关联分析
  9. 面向对象——类设计(七)
  10. python技巧——使用list comprehension生成素数(prime number)