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 07 MySQL
仅用一句SQL更新整张表的涨跌幅、涨跌率的解决方案
May 06 MySQL
MySQL8.0无法启动3534的解决方法
Jun 03 MySQL
Mysql关于数据库是否应该使用外键约束详解说明
Oct 24 MySQL
MySQL利用UNION连接2个查询排序失效详解
Nov 20 MySQL
SQL基础查询和LINQ集成化查询
Jan 18 MySQL
MySQL多表查询机制
Mar 17 MySQL
mysql查询结果实现多列拼接查询
Apr 03 MySQL
MySQL运行报错:“Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre”解决方法
Jun 14 MySQL
关于mysql中string和number的转换问题
Jun 14 MySQL
关于MySQL中explain工具的使用
May 08 MySQL
MySQL索引失效十种场景与优化方案
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生成静态页面详解
2006/11/19 PHP
《PHP编程最快明白》第三讲:php数组
2010/11/01 PHP
php网页版聊天软件实现代码
2016/08/12 PHP
Js+Jq获取URL参数的集中方法示例代码
2014/05/20 Javascript
node.js中watch机制详解
2014/11/17 Javascript
Nodejs学习笔记之入门篇
2015/04/16 NodeJs
基于AngularJS实现iOS8自带的计算器
2016/09/12 Javascript
javascript汉字拼音互转的简单实例
2016/10/09 Javascript
js自定义QQ菜单效果
2017/01/10 Javascript
在点击div中的p时,如何阻止事件冒泡
2017/02/07 Javascript
JavaScript 事件流、事件处理程序及事件对象总结
2017/04/01 Javascript
Three.js 再探 - 写一个微信跳一跳极简版游戏
2018/01/04 Javascript
jQuery实现标签子元素的添加和赋值方法
2018/02/24 jQuery
vue.js使用v-if实现显示与隐藏功能示例
2018/07/06 Javascript
vue前端框架—Mint UI详解(更适用于移动端)
2019/04/30 Javascript
基于Vant UI框架实现时间段选择器
2020/12/24 Javascript
[53:15]Newbee vs Pain 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[03:39]这就是刀塔,我们是冠军!燃情短片讲述我们的DOTA故事
2019/07/02 DOTA
Python将图片批量从png格式转换至WebP格式
2020/08/22 Python
Anaconda2下实现Python2.7和Python3.5的共存方法
2018/06/11 Python
python实现任意位置文件分割的实例
2018/12/14 Python
对python:循环定义多个变量的实例详解
2019/01/20 Python
在Python中居然可以定义两个同名通参数的函数
2019/01/31 Python
python使用wxpy实现微信消息防撤回脚本
2019/04/29 Python
python输出电脑上所有的串口名的方法
2019/07/02 Python
安装PyInstaller失败问题解决
2019/12/14 Python
python GUI库图形界面开发之PyQt5窗口控件QWidget详细使用方法
2020/02/26 Python
解决django的template中如果无法引用MEDIA_URL问题
2020/04/07 Python
python3.6.8 + pycharm + PyQt5 环境搭建的图文教程
2020/06/11 Python
css3教程之倾斜页面
2014/01/27 HTML / CSS
巴西独家产品和现场演示购物网站:Shoptime
2019/07/11 全球购物
美国椅子和沙发制造商:La-Z-Boy
2020/10/25 全球购物
简历中求职的个人自我评价
2013/12/03 职场文书
基层党员干部四风问题整改方向和措施
2014/09/25 职场文书
国际政治学专业推荐信
2014/09/26 职场文书
PyTorch中permute的使用方法
2022/04/26 Python