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数字类型自增的坑
May 07 MySQL
MySQL 存储过程的优缺点分析
May 20 MySQL
通过shell脚本对mysql的增删改查及my.cnf的配置
Jul 07 MySQL
mysql定时自动备份数据库的方法步骤
Jul 07 MySQL
SQL实战演练之网上商城数据库商品类别数据操作
Oct 24 MySQL
MySQL基于索引的压力测试的实现
Nov 07 MySQL
mysql函数全面总结
Nov 11 MySQL
mysql创建存储过程及函数详解
Dec 04 MySQL
weblogic服务建立数据源连接测试更新mysql驱动包的问题及解决方法
Jan 22 MySQL
mysql数据库实现设置字段长度
Jun 10 MySQL
手把手带你彻底卸载MySQL数据库
Jun 14 MySQL
MySQL分布式恢复进阶
Jul 23 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实现SAE上使用storage上传与下载文件的方法
2015/06/29 PHP
比较完整的微信开发php代码
2016/08/02 PHP
PHP简单计算两个时间差的方法示例
2017/06/20 PHP
如何在PHP中读写文件
2020/09/07 PHP
javascrip客户端验证文件大小及文件类型并重置上传
2011/01/12 Javascript
如何使用PHP+jQuery+MySQL实现异步加载ECharts地图数据(附源码下载)
2016/02/23 Javascript
jquery div模态窗口的简单实例
2016/05/28 Javascript
Bootstrap 网站实例之单页营销网站
2016/10/20 Javascript
JavaScript设计模式之单例模式详解
2017/06/09 Javascript
JavaScript数据结构之双向链表定义与使用方法示例
2017/10/27 Javascript
koa2 用户注册、登录校验与加盐加密的实现方法
2019/07/22 Javascript
[02:16]DOTA2英雄基础教程 干扰者
2014/01/15 DOTA
[03:14]2014DOTA2西雅图国际邀请赛 EG战队巡礼
2014/07/07 DOTA
[02:51]2014DOTA2 TI小组赛总结中国军团全部进军钥匙球馆
2014/07/15 DOTA
python定向爬取淘宝商品价格
2018/02/27 Python
python实现公司年会抽奖程序
2019/01/22 Python
简单了解python高阶函数map/reduce
2019/06/28 Python
python 含子图的gif生成时内存溢出的方法
2019/07/07 Python
python字符串分割及字符串的一些常规方法
2019/07/24 Python
django 基于中间件实现限制ip频繁访问过程详解
2019/07/30 Python
使用python写一个自动浏览文章的脚本实例
2019/12/05 Python
python实现查找所有程序的安装信息
2020/02/18 Python
基于Pyinstaller打包Python程序并压缩文件大小
2020/05/28 Python
通过实例解析python subprocess模块原理及用法
2020/10/10 Python
美国亚洲时尚和美容产品的一站式网上商店:Stylevana
2019/09/05 全球购物
英国领先的在线礼品店:Getting Personal
2019/09/24 全球购物
C语言变量的命名规则都有哪些
2013/12/27 面试题
几个判断型的面试题
2012/07/03 面试题
中专毕业生自我鉴定
2013/11/21 职场文书
办加油卡单位介绍信
2014/01/09 职场文书
安全员岗位职责
2015/02/10 职场文书
学生会个人总结范文
2015/02/15 职场文书
亮剑观后感500字
2015/06/05 职场文书
小区物业管理2015年度工作总结
2015/10/22 职场文书
小学生反邪教心得体会
2016/01/15 职场文书
使用logback实现按自己的需求打印日志到自定义的文件里
2021/08/30 Java/Android