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 16 MySQL
仅用一句SQL更新整张表的涨跌幅、涨跌率的解决方案
May 06 MySQL
Mysql官方性能测试工具mysqlslap的使用简介
May 21 MySQL
MYSQL 无法识别中文的永久解决方法
Jun 03 MySQL
MYSQL 的10大经典优化案例场景实战
Sep 14 MySQL
浅谈mysql哪些情况会导致索引失效
Nov 20 MySQL
MySQL读取JSON转换的方式
Mar 18 MySQL
MySQL创建表操作命令分享
Mar 25 MySQL
Mysql调整优化之四种分区方式以及组合分区
Apr 13 MySQL
mysql 获取相邻数据项
May 11 MySQL
MySQL GTID复制的具体使用
May 20 MySQL
MySQL提升大量数据查询效率的优化神器
Jul 07 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
destoon后台网站设置变成空白的解决方法
2014/06/21 PHP
PHP7 参数处理机制修改
2021/03/09 PHP
在b/s开发中经常用到的javaScript技术
2006/08/23 Javascript
js对象与打印对象分析比较
2013/04/23 Javascript
jquery 模板的应用示例
2013/11/12 Javascript
jQuery判断checkbox是否选中的小例子
2013/12/02 Javascript
js树插件zTree获取所有选中节点数据的方法
2015/01/28 Javascript
jQuery超赞的评分插件(8款)
2015/08/20 Javascript
js判断图片加载完成后获取图片实际宽高的方法
2016/02/25 Javascript
html+javascript+bootstrap实现层级多选框全层全选和多选功能
2017/03/09 Javascript
bootstrap响应式表格实例详解
2017/05/15 Javascript
使用async await 封装 axios的方法
2018/07/09 Javascript
jQuery中常用动画效果函数知识点整理
2018/08/19 jQuery
python实现上传样本到virustotal并查询扫描信息的方法
2014/10/05 Python
python直接访问私有属性的简单方法
2016/07/25 Python
解决Python中字符串和数字拼接报错的方法
2016/10/23 Python
Python 判断文件或目录是否存在的实例代码
2018/07/19 Python
python中的常量和变量代码详解
2018/07/25 Python
了解不常见但是实用的Python技巧
2019/05/23 Python
python KNN算法实现鸢尾花数据集分类
2019/10/24 Python
在OpenCV里实现条码区域识别的方法示例
2019/12/04 Python
python之MSE、MAE、RMSE的使用
2020/02/24 Python
sklearn线性逻辑回归和非线性逻辑回归的实现
2020/06/09 Python
HTML5 Canvas——用路径描画线条实例介绍
2013/06/09 HTML / CSS
享受加州生活方式的时尚舒适:XCVI
2018/07/09 全球购物
几道数据库的面试题或笔试题
2014/05/31 面试题
优秀应届生推荐信
2013/11/09 职场文书
毕业生个人求职信范文分享
2014/01/05 职场文书
应用化学专业职业生涯规划书
2014/01/22 职场文书
个人安全生产责任书
2014/07/28 职场文书
与美同行演讲稿
2014/09/13 职场文书
世界遗产导游词
2015/02/13 职场文书
2015年街道办事处团委工作总结
2015/10/14 职场文书
心理健康教育培训研修感言
2015/11/18 职场文书
经典人生语录分享:不畏将来,不念过去,笑对当下
2019/12/12 职场文书
基于Python实现nc批量转tif格式
2022/08/14 Python