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的join buffer原理
Apr 29 MySQL
my.ini优化mysql数据库性能的十个参数(推荐)
May 26 MySQL
Mysql 设置boolean类型的操作
Jun 04 MySQL
如何使用分区处理MySQL的亿级数据优化
Jun 18 MySQL
Mysql数据库值的添加、修改、删除及清空操作实例
Jun 20 MySQL
解决mysql:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO/YES)
Jun 26 MySQL
MySQL中IO问题的深入分析与优化
Apr 02 MySQL
MySQL表锁、行锁、排它锁及共享锁的使用详解
Apr 02 MySQL
MySQL数据库 任意ip连接方法
May 20 MySQL
mysql 排序失效
May 20 MySQL
深入理解MySQL中MVCC与BufferPool缓存机制
May 25 MySQL
MySQL transaction事务安全示例讲解
Jun 21 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三元运算符的结合性介绍
2012/01/10 PHP
php创建、获取cookie及基础要点分析
2015/01/26 PHP
PHP CURL 多线程操作代码实例
2015/05/13 PHP
既简单又安全的PHP验证码 附调用方法
2016/06/02 PHP
php cookie工作原理与实例详解
2016/07/18 PHP
laravel 关联关系遍历数组的例子
2019/10/10 PHP
in.js 一个轻量级的JavaScript颗粒化模块加载和依赖关系管理解决方案
2011/07/26 Javascript
js中判断文本框是否为空的两种方法
2011/07/31 Javascript
javascript预加载图片、css、js的方法示例介绍
2013/10/14 Javascript
微信小程序 滚动到某个位置添加class效果实现代码
2017/04/19 Javascript
Vue-cli proxyTable 解决开发环境的跨域问题详解
2017/05/18 Javascript
Angular4实现鼠标悬停3d倾斜效果
2017/10/25 Javascript
Vue 让元素抖动/摆动起来的实现代码
2018/05/31 Javascript
Angular动态绑定样式及改变UI框架样式的方法小结
2018/09/03 Javascript
NodeJS使用Range请求实现下载功能的方法示例
2018/10/12 NodeJs
vue cli 3.x 项目部署到 github pages的方法
2019/04/17 Javascript
vue项目中仿element-ui弹框效果的实例代码
2019/04/22 Javascript
详解vue更改头像功能实现
2019/04/28 Javascript
vue总线机制(bus)知识点详解
2020/05/10 Javascript
Python基于time模块求程序运行时间的方法
2017/09/18 Python
python实现剪切功能
2019/01/23 Python
对dataframe数据之间求补集的实例详解
2019/01/30 Python
Python3如何使用tabulate打印数据
2020/09/25 Python
Html5调用手机摄像头并实现人脸识别的实现
2018/12/21 HTML / CSS
比利时家具购买网站:Home24
2019/01/03 全球购物
环境工程毕业生自荐信
2013/11/17 职场文书
小区门卫岗位职责
2013/12/31 职场文书
心理健康课教学反思
2014/02/13 职场文书
三万活动总结
2014/04/28 职场文书
运动会演讲稿200字
2014/08/25 职场文书
购房协议书范本(无房产证)
2014/10/07 职场文书
爱心助学感谢信
2015/01/21 职场文书
2015年城管个人工作总结范文
2015/04/20 职场文书
小学2016年“我们的节日·重阳节”活动总结
2016/04/01 职场文书
Pytorch GPU内存占用很高,但是利用率很低如何解决
2021/06/01 Python
十大最强格斗系宝可梦,超梦X仅排第十,第二最重格斗礼仪
2022/03/18 日漫