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 8.0.24 安装配置方法图文教程
May 12 MySQL
MySQL 逻辑备份与恢复测试的相关总结
May 14 MySQL
Mysql Online DDL的使用详解
May 20 MySQL
MySQL 8.0 之不可见列的基本操作
May 20 MySQL
mysql脏页是什么
Jul 26 MySQL
mysql sum(if())和count(if())的用法说明
Jan 18 MySQL
MySQL分区表管理命令汇总
Mar 21 MySQL
你真的会用Mysql的explain吗
Mar 31 MySQL
Mysql超详细讲解死锁问题的理解
Apr 01 MySQL
MySQL生成千万测试数据以及遇到的问题
Aug 05 MySQL
一文解答什么是MySQL的回表
Aug 05 MySQL
MySQL中LAG()函数和LEAD()函数的使用
Aug 14 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
PHP3 safe_mode 失效漏洞
2006/10/09 PHP
php mysql索引问题
2008/06/07 PHP
PHP实现批量生成App各种尺寸Logo
2015/03/19 PHP
Laravel 5框架学习之Blade 简介
2015/04/08 PHP
Yii使用DeleteAll连表删除出现报错问题的解决方法
2016/07/14 PHP
php is_writable判断文件是否可写实例代码
2016/10/13 PHP
POST一个JSON格式的数据给Restful服务实例详解
2017/04/07 PHP
详解PHP素材图片上传、下载功能
2019/04/12 PHP
javascript StringBuilder类实现
2008/12/22 Javascript
基于JavaScript自定义构造函数的详解说明
2013/04/24 Javascript
判断一个变量是数组Array类型的方法
2013/09/16 Javascript
JavaScript 事件对象介绍
2015/04/13 Javascript
js简单网速测试方法完整实例
2015/12/15 Javascript
js显示动态时间的方法详解
2016/08/20 Javascript
微信公众号支付H5调用支付解析
2016/11/04 Javascript
React.js绑定this的5种方法(小结)
2018/06/05 Javascript
微信小程序实现滴滴导航tab切换效果
2018/07/24 Javascript
详解微信小程序获取当前时间及日期的方法
2019/04/28 Javascript
vue根据条件不同显示不同按钮的操作
2020/08/04 Javascript
Vue父组件监听子组件生命周期
2020/09/03 Javascript
[01:10:58]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
Python正则表达式教程之二:捕获篇
2017/03/02 Python
Python3使用pandas模块读写excel操作示例
2018/07/03 Python
tensorflow实现加载mnist数据集
2018/09/08 Python
python批量修改图片后缀的方法(png到jpg)
2018/10/25 Python
使用SimpleITK读取和保存NIfTI/DICOM文件实例
2020/07/01 Python
PyCharm 2020.2下配置Anaconda环境的方法步骤
2020/09/23 Python
用Python自动清理系统垃圾的实现
2021/01/18 Python
继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么?
2015/11/18 面试题
信息专业本科生个人的自我评价
2013/10/28 职场文书
学校安全工作制度
2014/01/19 职场文书
2015年保送生自荐信
2015/03/24 职场文书
员工旷工检讨书
2015/08/15 职场文书
2016公司中秋节寄语
2015/12/07 职场文书
2019终止劳动合同协议书最新范本!
2019/07/09 职场文书
JavaScript与JQuery框架基础入门教程
2021/07/15 Javascript