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性能压力基准测试工具sysbench的使用简介
Apr 21 MySQL
MySQL之高可用集群部署及故障切换实现
Apr 22 MySQL
MySQL创建高性能索引的全步骤
May 02 MySQL
MySQL连表查询分组去重的实现示例
Jul 01 MySQL
解决mysql的int型主键自增问题
Jul 15 MySQL
MySQL子查询中order by不生效问题的解决方法
Aug 02 MySQL
mysql事务对效率的影响分析总结
Oct 24 MySQL
MySQL窗口函数的具体使用
Nov 17 MySQL
Mysql存储过程、触发器、事件调度器使用入门指南
Jan 22 MySQL
mysql自增长id用完了该怎么办
Feb 12 MySQL
mysql中数据库覆盖导入的几种方式总结
Mar 25 MySQL
MySQL中EXPLAIN语句及用法
May 20 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/07/22 PHP
php项目中百度 UEditor 简单安装调试和调用
2015/07/15 PHP
微信利用PHP创建自定义菜单的方法
2016/08/01 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
2017/09/17 PHP
PHP 进程池与轮询调度算法实现多任务的示例代码
2019/11/26 PHP
yii2.0框架多模型操作示例【添加/修改/删除】
2020/04/13 PHP
jQuery+jqmodal弹出窗口实现代码分明
2010/06/14 Javascript
JavaScript 模式之工厂模式(Factory)应用介绍
2012/11/15 Javascript
file模式访问网页时iframe高度自适应解决方案
2013/01/16 Javascript
ie8本地图片上传预览示例代码
2014/01/12 Javascript
js怎么覆盖原有方法实现重写
2014/09/04 Javascript
jQuery+CSS3实现树叶飘落特效
2015/02/01 Javascript
js实现的二分查找算法实例
2016/01/21 Javascript
Bootstrap源码解读表单(2)
2016/12/22 Javascript
AngularJS Controller作用域
2017/01/09 Javascript
javascript中json基础知识详解
2017/01/19 Javascript
利用HBuilder打包前端开发webapp为apk的方法
2017/11/13 Javascript
Angular路由ui-router配置详解
2018/08/01 Javascript
微信小程序使用echarts获取数据并生成折线图
2019/10/16 Javascript
element-ui树形控件后台返回的数据+生成组织树的工具类
2020/03/05 Javascript
javascript单张多张图无缝滚动实例代码
2020/05/10 Javascript
jQuery+ThinkPHP实现图片上传
2020/07/23 jQuery
Python获取linux主机ip的简单实现方法
2016/04/18 Python
Python 如何访问外围作用域中的变量
2016/09/11 Python
python验证码识别教程之滑动验证码
2018/06/04 Python
python3爬虫之设计签名小程序
2018/06/19 Python
python数据批量写入ScrolledText的优化方法
2018/10/11 Python
python实现两个经纬度点之间的距离和方位角的方法
2019/07/05 Python
Anaconda+Pycharm环境下的PyTorch配置方法
2020/03/13 Python
利用html5 file api读取本地文件示例(如图片、PDF等)
2018/03/07 HTML / CSS
数学系毕业生的自我评价
2014/01/10 职场文书
城市轨道交通工程职业规划书范文
2014/01/18 职场文书
公司司机岗位职责
2014/02/07 职场文书
党的群众路线教育实践活动领导班子整改方案
2014/10/25 职场文书
加强党性修养心得体会
2016/01/21 职场文书
2019毕业典礼主持词!
2019/07/05 职场文书