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 Show Profile
Apr 05 MySQL
mysql的MVCC多版本并发控制的实现
Apr 14 MySQL
MySQL 常见存储引擎的优劣
Jun 02 MySQL
MySQL8.0.18配置多主一从
Jun 21 MySQL
mysql事务隔离级别详情
Oct 24 MySQL
面试被问select......for update会锁表还是锁行
Nov 11 MySQL
mysql中数据库覆盖导入的几种方式总结
Mar 25 MySQL
Mysql使用全文索引(FullText index)的实例代码
Apr 03 MySQL
详解Mysql事务并发(脏读、不可重复读、幻读)
Apr 29 MySQL
MySQL的prepare使用以及遇到的bug
May 11 MySQL
MySql中的json_extract函数处理json字段详情
Jun 05 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读取csv文件内容的详解
2013/06/18 PHP
关于JSON以及JSON在PHP中的应用技巧
2013/11/27 PHP
PHP获取某个月最大天数(最后一天)的方法
2015/07/29 PHP
Yii框架弹出窗口组件CJuiDialog用法分析
2017/01/07 PHP
thinkPHP5实现的查询数据库并返回json数据实例
2017/10/23 PHP
javascript document.images实例
2008/05/27 Javascript
纯文字版返回顶端的js代码
2013/08/01 Javascript
JQuery获取表格数据示例代码
2014/05/26 Javascript
javascript点击按钮实现隐藏显示切换效果
2016/02/03 Javascript
深入理解JavaScript中为什么string可以拥有方法
2016/05/24 Javascript
jquery siblings获取同辈元素用法实例分析
2016/07/25 Javascript
jquery实现图片列表鼠标移入微动
2016/12/01 Javascript
vue.js的computed,filter,get,set的用法及区别详解
2018/03/08 Javascript
node打造微信个人号机器人的方法示例
2018/04/26 Javascript
快速解决layui弹窗按enter键不停弹窗的问题
2019/09/18 Javascript
vue在路由中验证token是否存在的简单实现
2019/11/11 Javascript
js验证账户名是否重复
2020/05/26 Javascript
python根据京东商品url获取产品价格
2015/08/09 Python
利用python求相邻数的方法示例
2017/08/18 Python
python使用邻接矩阵构造图代码示例
2017/11/10 Python
python2.7 json 转换日期的处理的示例
2018/03/07 Python
Python爬虫获取图片并下载保存至本地的实例
2018/06/01 Python
使用PyQt4 设置TextEdit背景的方法
2019/06/14 Python
Python Pandas实现数据分组求平均值并填充nan的示例
2019/07/04 Python
Python 调用 Windows API COM 新法
2019/08/22 Python
python+selenium 简易地疫情信息自动打卡签到功能的实现代码
2020/08/22 Python
美国彩妆品牌:Coastal Scents
2017/04/01 全球购物
Weblogc domain问题
2014/01/27 面试题
银行自荐信范文
2013/10/07 职场文书
社区工作感言
2014/02/21 职场文书
80后职场人的职业生涯规划
2014/03/08 职场文书
公司开业庆典策划方案
2014/06/04 职场文书
2014年作风建设心得体会
2014/10/22 职场文书
2015年领导班子工作总结
2015/05/23 职场文书
祝酒词范文
2015/08/12 职场文书
python3操作redis实现List列表实例
2021/08/04 Python