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 22 MySQL
MySQL 数据恢复的多种方法汇总
Jun 21 MySQL
MySQL系列之八 MySQL服务器变量
Jul 02 MySQL
MySQL的全局锁和表级锁的具体使用
Aug 23 MySQL
MySQL中的隐藏列的具体查看
Sep 04 MySQL
MySQL数据库如何给表设置约束详解
Mar 13 MySQL
Nebula Graph解决风控业务实践
Mar 31 MySQL
MySQL 外连接语法之 OUTER JOIN
Apr 09 MySQL
SQLServer常见数学函数梳理总结
Aug 05 MySQL
MySQL中LAG()函数和LEAD()函数的使用
Aug 14 MySQL
MySQL数据管理操作示例讲解
Dec 24 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中使用Sockets 从Usenet中获取文件
2008/01/10 PHP
PHP Session_Regenerate_ID函数双释放内存破坏漏洞
2011/01/27 PHP
PHP使用DES进行加密与解密的方法详解
2013/06/06 PHP
PHP实现的登录,注册及密码修改功能分析
2016/11/25 PHP
yii2.0框架多模型操作示例【添加/修改/删除】
2020/04/13 PHP
jQuery AJAX回调函数this指向问题
2010/02/08 Javascript
写了10年的Javascript也未必全了解的连续赋值运算
2011/03/25 Javascript
CSS(js)限制页面显示的文本字符长度
2012/12/27 Javascript
Jquery 表单验证类介绍与实例
2013/06/09 Javascript
用Javascript来生成ftp脚本的小例子
2013/07/03 Javascript
关于Javascript作用域链的八点总结
2013/12/06 Javascript
jquery fancybox ie6不显示关闭按钮的解决办法
2013/12/25 Javascript
动态加载jquery库的方法
2014/02/12 Javascript
jquery获取radio值实例
2014/10/16 Javascript
JavaScript获得表单target属性的方法
2015/04/02 Javascript
jQuery插件cxSelect多级联动下拉菜单实例解析
2016/06/24 Javascript
EasyUI创建对话框的两种方式
2016/08/23 Javascript
详解nodejs express下使用redis管理session
2017/04/24 NodeJs
Vuejs实现购物车功能
2017/11/05 Javascript
微信小程序基于slider组件动态修改标签透明度的方法示例
2017/12/04 Javascript
react 创建单例组件的方法
2018/04/26 Javascript
JS实现动态生成html table表格的方法分析
2018/07/11 Javascript
解决vue router组件状态刷新消失的问题
2018/08/01 Javascript
微信小程序之左右布局的实现代码
2019/12/13 Javascript
[06:53]2018DOTA2国际邀请赛寻真——勇于创新的Vici Gaming
2018/08/14 DOTA
[03:08]TI9战队档案 - Vici Gaming
2019/08/20 DOTA
详解Django rest_framework实现RESTful API
2018/05/24 Python
python 用for循环实现1~n求和的实例
2019/02/01 Python
pandas中DataFrame修改index、columns名的方法示例
2019/08/02 Python
Win下PyInstaller 安装和使用教程
2019/12/25 Python
什么是python的id函数
2020/06/11 Python
丝芙兰巴西官方商城:SEPHORA巴西
2016/10/31 全球购物
华美博弈C/VC工程师笔试试题
2012/07/16 面试题
顺丰快递Java软件工程师面试题
2015/07/31 面试题
小学生开学感言
2014/02/28 职场文书
创业项目(超低成本创业项目)
2019/08/16 职场文书