mysql通过group by分组取最大时间对应数据的两种有效方法


Posted in MySQL onSeptember 23, 2022

1、项目记录表project_record的结构和数据如下:

mysql通过group by分组取最大时间对应数据的两种有效方法

以下为项目记录表project_record的所有数据。project_id为项目Id,on_project_time为上项目时间。(每一条数据代表着上某个项目(project_id)的时间(on_project_time)记录)

mysql通过group by分组取最大时间对应数据的两种有效方法

2、我们的需求是:取出每个项目中最大上项目时间对应的那条数据。(即根据project_id分组,取出每组中最大的on_project_time对应的数据。)上方红框是我们要查出的数据

3、错误代码:

SELECT * 
FROM (SELECT * FROM project_record order by on_project_time desc) t 
GROUP BY project_id;

查询结果错误:

mysql通过group by分组取最大时间对应数据的两种有效方法

结果看似正确的,实则是错误的。每个项目最大的上项目时间能正确查出,但是数据对应的id不正确。

分析发现,对于每一个分组,分组后的结果总是取组中主键(id)最小的数据,即group by project_id 总会对project_id执行排序(正序)

 而不论临时表(t)中是否已排序,都会取组中主键id最小的一行数据。换句话说 临时表t 内的排序 无法影响外层的group by 的操作。

4、 正确方法如下:

方法一:

SELECT t1.*
FROM project_record t1
INNER JOIN (
SELECT DISTINCT(id) id
FROM project_record 
ORDER BY on_project_time DESC) AS t2 ON t2.id = t1.id
GROUP BY t1.project_id;

查询结果正确:

mysql通过group by分组取最大时间对应数据的两种有效方法

思路:需要关联一张表,这个关联表t2中的数据是对原表t1按照上项目时间倒叙排列,注意,此处必须使用distinct,此处distinct的作用可以理解为将t1表数据顺序固定为t2表顺序。

主表GROUP BY 后会取出按条件分组后的第一条数据。

方法二:

select t1.*
FROM project_record t1
INNER JOIN (SELECT SUBSTRING_INDEX(GROUP_CONCAT(id ORDER BY on_project_time DESC),',',1) AS id
FROM project_record GROUP BY project_id) AS t2 ON t2.id = t1.id;

查询结果正确:

mysql通过group by分组取最大时间对应数据的两种有效方法

SUBSTRING_INDEX 用法:取排序后的分组的第一条数据。 

本人习惯使用第一种方法。

总结

到此这篇关于mysql通过group by分组取最大时间对应数据的两种有效方法的文章就介绍到这了,更多相关mysql group by分组取对应数据内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
mysql查询的控制语句图文详解
Apr 11 MySQL
MySQL InnoDB ReplicaSet(副本集)简单介绍
Apr 24 MySQL
如何使用分区处理MySQL的亿级数据优化
Jun 18 MySQL
MySQL GRANT用户授权的实现
Jun 18 MySQL
MySQL约束超详解
Sep 04 MySQL
MYSQL 表的全面总结
Nov 11 MySQL
MySQL读取JSON转换的方式
Mar 18 MySQL
解决MySQL Varchar 类型尾部空格的问题
Apr 06 MySQL
MySQL创建管理子分区
Apr 13 MySQL
MySQL 条件查询的常用操作
Apr 28 MySQL
详细介绍MySQL中limit和offset的用法
May 06 MySQL
postgresql如何找到表中重复数据的行并删除
May 08 MySQL
MySQL中dd::columns表结构转table过程及应用详解
Sep 23 #MySQL
MySQL使用IF语句及用case语句对条件并结果进行判断 
Sep 23 #MySQL
MySQL远程无法连接的一些常见原因总结
Sep 23 #MySQL
MySQL count(*)统计总数问题汇总
Sep 23 #MySQL
MySQL常用慢查询分析工具详解
Aug 14 #MySQL
了解MySQL查询语句执行过程(5大组件)
Aug 14 #MySQL
MySQL 原理与优化之Update 优化
Aug 14 #MySQL
You might like
PHP目录函数实现创建、读取目录教程实例
2011/01/13 PHP
javascript 放大镜 v1.0 基于Yui2 实现的放大镜效果
2010/03/08 Javascript
用js来获取上传的文件名纯粹是为了美化而用
2013/10/23 Javascript
不使用ajax实现无刷新提交表单
2014/12/21 Javascript
javascript设计模式之中介者模式Mediator
2014/12/30 Javascript
第七章之菜单按钮图标组件
2016/04/25 Javascript
jquery html动态添加的元素绑定事件详解
2016/05/24 Javascript
AngularJS入门教程之AngularJS 模板
2016/08/18 Javascript
js 轮播效果实例分享
2016/12/28 Javascript
jquery+css实现侧边导航栏效果
2017/06/12 jQuery
AngularJS 异步解决实现方法
2017/06/12 Javascript
bootstrap基本配置_动力节点Java学院整理
2017/07/14 Javascript
vue如何使用 Slot 分发内容实例详解
2017/09/05 Javascript
JS实现点击生成UUID的方法完整实例【基于jQuery】
2019/06/12 jQuery
解决vuex改变了state的值,但是页面没有更新的问题
2020/11/12 Javascript
python去掉字符串中重复字符的方法
2014/02/27 Python
Python将xml和xsl转换为html的方法
2015/03/10 Python
Phantomjs抓取渲染JS后的网页(Python代码)
2016/05/13 Python
浅谈python装饰器探究与参数的领取
2017/12/01 Python
python flask框架实现重定向功能示例
2019/07/02 Python
Django框架模型简单介绍与使用分析
2019/07/18 Python
python连接PostgreSQL数据库的过程详解
2019/09/18 Python
Python3中的f-Strings增强版字符串格式化方法
2020/03/04 Python
Python 生成VOC格式的标签实例
2020/03/10 Python
html5的pushstate以及监听浏览器返回事件的实现
2020/08/11 HTML / CSS
美国最大的珠宝商之一:Littman Jewelers
2016/11/13 全球购物
Black Halo官方网站:购买连衣裙、礼服和连体裤
2018/06/13 全球购物
经典c++面试题二
2015/08/14 面试题
舞蹈教师自荐信
2014/01/27 职场文书
生产助理岗位职责
2014/06/18 职场文书
工厂清洁工岗位职责
2015/02/14 职场文书
写给媳妇的检讨书
2015/05/06 职场文书
JavaScript 防篡改对象的用法示例
2021/04/24 Javascript
Django给表单添加honeypot验证增加安全性
2021/05/06 Python
Python图片验证码降噪和8邻域降噪
2021/08/30 Python
Win11安全功能升级:内置防网络钓鱼功能
2022/04/08 数码科技