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 05 MySQL
MySQL命令行操作时的编码问题详解
Apr 14 MySQL
解决MySQL存储时间出现不一致的问题
Apr 28 MySQL
Mysql数据库按时间点恢复实战记录
Jun 30 MySQL
MySQL表类型 存储引擎 的选择
Nov 11 MySQL
MySQL中order by的使用详情
Nov 17 MySQL
MySQL Innodb索引机制详细介绍
Nov 23 MySQL
详解MySQL中timestamp和datetime时区问题导致做DTS遇到的坑
Dec 06 MySQL
MySQL创建定时任务
Jan 22 MySQL
mysql insert 存在即不插入语法说明
Mar 25 MySQL
Mysql查询时间区间日期列表,不会由于数据表数据影响
Apr 19 MySQL
MySQL优化之慢日志查询
Jun 10 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 DOS攻击实现代码(附如何防范)
2012/05/29 PHP
PHP之APC缓存详细介绍 apc模块安装
2014/01/13 PHP
php语言的7种基本的排序方法
2020/12/28 PHP
PHP封装的数据库保存session功能类
2016/07/11 PHP
javascript 读取XML数据,在页面中展现、编辑、保存的实现
2009/10/27 Javascript
ImageZoom 图片放大镜效果(多功能扩展篇)
2010/04/14 Javascript
利用JQuery动画制作滑动菜单项效果实现步骤及代码
2013/02/07 Javascript
jquery easyui中treegrid用法的简单实例
2014/02/18 Javascript
14个有用的Jquery技巧分享
2015/01/08 Javascript
js实现星星打分效果的方法
2020/07/05 Javascript
js点击列表文字对应该行显示背景颜色的实现代码
2015/08/05 Javascript
每日十条JavaScript经验技巧(一)
2016/06/23 Javascript
js智能获取浏览器版本UA信息的方法
2016/08/08 Javascript
详解VScode编辑器vue环境搭建所遇问题解决方案
2019/04/26 Javascript
基于Fixed定位的框选功能的实现代码
2019/05/13 Javascript
原生js实现trigger方法示例代码
2019/05/22 Javascript
Vuex modules模式下mapState/mapMutations的操作实例
2019/10/17 Javascript
[02:41]辉夜杯现场一家三口 “我爸玩风行 我玩血魔”
2015/12/27 DOTA
详细介绍Python中的偏函数
2015/04/27 Python
Python爬虫辅助利器PyQuery模块的安装使用攻略
2016/04/24 Python
Python3单行定义多个变量或赋值方法
2018/07/12 Python
python实现图片筛选程序
2018/10/24 Python
Pycharm+Scrapy安装并且初始化项目的方法
2019/01/15 Python
python实现吃苹果小游戏
2020/03/21 Python
python 已知平行四边形三个点,求第四个点的案例
2020/04/12 Python
ProBikeKit新西兰:自行车套件,跑步和铁人三项装备
2017/04/05 全球购物
智能电子秤、手表和健康监测仪:Withings(之前为诺基亚健康)
2018/10/30 全球购物
幼师求职自荐信
2014/05/31 职场文书
医院安全生产月活动总结
2014/07/05 职场文书
班子个人四风问题整改措施
2014/10/04 职场文书
党员作风建设整改方案
2014/10/27 职场文书
本科毕业论文导师评语
2014/12/31 职场文书
产品质量保证书范本
2015/02/27 职场文书
拾金不昧表扬信怎么写
2015/05/04 职场文书
MySQL数字类型自增的坑
2021/05/07 MySQL
分享CSS盒子模型隐藏的几种方式
2022/02/28 HTML / CSS