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 22 MySQL
mysql数据库入门第一步之创建表
May 14 MySQL
MySQL 8.0 之不可见列的基本操作
May 20 MySQL
MySQL 数据类型选择原则
May 27 MySQL
Mysql排序的特性详情
Nov 01 MySQL
MySQL之select、distinct、limit的使用
Nov 11 MySQL
如何避免mysql启动时错误及sock文件作用分析
Jan 22 MySQL
navicat 连接Ubuntu虚拟机的mysql的操作方法
Apr 02 MySQL
Mysql 一主多从的部署
May 20 MySQL
Mysql中@和@@符号的详细使用指南
Jun 05 MySQL
SQL Server数据库的三种创建方法汇总
May 08 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获取后台Job管理的实现代码
2011/06/10 PHP
PHP生成器简单实例
2015/05/13 PHP
Javascript继承(上)——对象构建介绍
2012/11/08 Javascript
Jquery焦点与失去焦点示例应用
2014/06/10 Javascript
javascript面向对象快速入门实例
2015/01/13 Javascript
jQuery树形下拉菜单特效代码分享
2015/08/15 Javascript
jQuery实现鼠标悬停背景翻转的黑色导航菜单代码
2015/09/14 Javascript
JavaScript编程学习技巧汇总
2016/02/21 Javascript
浅谈EasyUi ComBotree树修改 父节点选择的问题
2016/11/07 Javascript
微信小程序 实现拖拽事件监听实例详解
2016/11/16 Javascript
vue.js 获取当前自定义属性值
2017/06/01 Javascript
如何重置vue打印变量的显示方式
2017/12/06 Javascript
使用imba.io框架得到比 vue 快50倍的性能基准
2019/06/17 Javascript
在Django的视图(View)外使用Session的方法
2015/07/23 Python
Python之Scrapy爬虫框架安装及简单使用详解
2017/12/22 Python
flask框架使用orm连接数据库的方法示例
2018/07/16 Python
Python numpy.array()生成相同元素数组的示例
2018/11/12 Python
解决Python运行文件出现out of memory框的问题
2018/12/03 Python
python实现移位加密和解密
2019/03/22 Python
在Python中COM口的调用方法
2019/07/03 Python
python+opencv实现车牌定位功能(实例代码)
2019/12/24 Python
解决keras backend 越跑越慢问题
2020/06/18 Python
前端canvas水印快速制作(附完整代码)
2019/09/19 HTML / CSS
美国礼品卡商城: Gift Card Mall
2017/08/25 全球购物
Herve Leger官网:标志性绷带连衣裙等
2018/12/26 全球购物
俄罗斯隐形眼镜和眼镜在线商店:Cronos
2020/06/02 全球购物
心得体会怎么写
2013/12/30 职场文书
关于旷工的检讨书
2014/02/02 职场文书
后勤服务中心总经理工作职责
2014/03/03 职场文书
《风娃娃》教学反思
2014/04/19 职场文书
电话客服专员岗位职责
2014/06/28 职场文书
网吧消防安全责任书
2014/07/29 职场文书
员工试用期转正自我评价
2015/03/10 职场文书
农村党员干部承诺书
2015/05/04 职场文书
2016年青少年禁毒宣传教育活动总结(学校)
2016/04/05 职场文书
RestTemplate如何通过HTTP Basic Auth认证示例说明
2022/03/17 Java/Android