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 MVCC机制原理详解
Apr 20 MySQL
mysql 8.0.24 安装配置方法图文教程
May 12 MySQL
你知道哪几种MYSQL的连接查询
Jun 03 MySQL
MySQL的Query Cache图文详解
Jul 01 MySQL
MySQL深度分页(千万级数据量如何快速分页)
Jul 25 MySQL
Mysql案例刨析事务隔离级别
Sep 25 MySQL
MySQL中CURRENT_TIMESTAMP的使用方式
Nov 27 MySQL
MySQL 开窗函数
Feb 15 MySQL
MySQL学习必备条件查询数据
Mar 25 MySQL
为什么MySQL8新特性会修改自增主键属性
Apr 18 MySQL
MySql数据库 查询时间序列间隔
May 11 MySQL
MySQL GTID复制的具体使用
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+AJAX实现无刷新注册(带用户名实时检测)
2006/12/02 PHP
PHP学习笔记之三 数据库基本操作
2011/01/17 PHP
PHP使用Mysql事务实例解析
2014/09/08 PHP
php中strstr、strrchr、substr、stristr四个函数的区别总结
2014/09/22 PHP
php实现获取文章内容第一张图片的方法
2014/11/04 PHP
php通过sort()函数给数组排序的方法
2015/03/18 PHP
PHP自带方法验证邮箱、URL、IP是否合法的函数
2016/12/08 PHP
HTML中的setCapture和releaseCapture使用介绍
2012/03/21 Javascript
js实现按钮加背景图片常用方法
2014/11/01 Javascript
原生js结合html5制作小飞龙的简易跳球
2015/03/30 Javascript
javascript实现树形菜单的方法
2015/07/17 Javascript
JavaScript实现带缓冲效果的随屏滚动漂浮广告代码
2015/11/06 Javascript
jquery获取css的color值返回RGB的方法
2015/12/18 Javascript
jquery捕捉回车键及获取checkbox值与异步请求的方法
2015/12/24 Javascript
ES6所改良的javascript“缺陷”问题
2016/08/23 Javascript
如何理解Vue的render函数的具体用法
2017/08/30 Javascript
require.js 加载过程与使用方法介绍
2018/10/30 Javascript
基于pycharm导入模块显示不存在的解决方法
2018/10/13 Python
python得到电脑的开机时间方法
2018/10/15 Python
python 通过类中一个方法获取另一个方法变量的实例
2019/01/22 Python
详解python中的hashlib模块的使用
2019/04/22 Python
Python bytes string相互转换过程解析
2020/03/05 Python
TensorFlow2.1.0安装过程中setuptools、wrapt等相关错误指南
2020/04/08 Python
MAC平台基于Python Appium环境搭建过程图解
2020/08/13 Python
基于Python的接口自动化读写excel文件的方法
2021/01/15 Python
家乐福巴西网上超市:Carrefour巴西
2016/10/31 全球购物
Pure Collection美国官网:来自英国羊绒专家的奢华羊绒
2017/11/19 全球购物
UNIONBAY官网:美国青少年服装品牌
2019/03/26 全球购物
Myprotein芬兰官网:欧洲第一运动营养品牌
2019/05/05 全球购物
新加坡最早生产电动滑板车的制造商之一:FunsToTheFore
2020/09/08 全球购物
一套Java笔试题
2016/08/20 面试题
英文简历中的自我评价
2013/10/06 职场文书
公务员爱岗敬业演讲稿
2014/08/26 职场文书
公司介绍信范文
2015/01/31 职场文书
2015年医院科室工作总结范文
2015/05/26 职场文书
2016年优秀团员事迹材料
2016/02/25 职场文书