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
MySQL表的增删改查基础教程
Apr 07 MySQL
IDEA 链接Mysql数据库并执行查询操作的完整代码
May 20 MySQL
MySQL数据库压缩版本安装与配置详细教程
May 21 MySQL
分析mysql中一条SQL查询语句是如何执行的
Jun 21 MySQL
解决mysql:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO/YES)
Jun 26 MySQL
MySQL系列之二 多实例配置
Jul 02 MySQL
为什么MySQL 删除表数据 磁盘空间还一直被占用
Oct 16 MySQL
Mysql中一千万条数据怎么快速查询
Dec 06 MySQL
解决Mysql多行子查询的使用及空值问题
Jan 22 MySQL
实战 快速定位MySQL的慢SQL
Mar 22 MySQL
分析MySQL优化 index merge 后引起的死锁
Apr 19 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
ThinkPHP中调用PHPExcel的实现代码
2017/04/08 PHP
CentOS系统中PHP安装扩展的方式汇总
2017/04/09 PHP
js操作时间(年-月-日 时-分-秒 星期几)
2010/06/20 Javascript
jquery nth-child()选择器的简单应用
2010/07/10 Javascript
jquery控制左右箭头滚动图片列表的实例
2013/05/20 Javascript
jQuery 鼠标经过(hover)事件的延时处理示例
2014/04/14 Javascript
javascript中Math.random()使用详解
2015/04/15 Javascript
Java中Timer的用法详解
2015/10/21 Javascript
Bootstrap模态框水平垂直居中与增加拖拽功能
2016/11/09 Javascript
Javascript oop设计模式 面向对象编程简单实例介绍
2016/12/13 Javascript
很棒的一组js图片轮播特效
2017/01/12 Javascript
老生常谈js中0到底是 true 还是 false
2017/03/08 Javascript
Nodejs下使用gm圆形裁剪并合成图片的示例
2018/02/22 NodeJs
JavaScript禁用右键单击优缺点分析
2019/01/20 Javascript
JavaScript函数式编程(Functional Programming)纯函数用法分析
2019/05/22 Javascript
利用原生JS实现data方法示例代码
2019/05/28 Javascript
react+redux仿微信聊天界面
2019/06/21 Javascript
JS监听组合按键思路及实现过程
2020/04/17 Javascript
微信小程序调用后台service教程详解
2020/11/06 Javascript
[01:14:05]《加油DOTA》第四期
2014/08/25 DOTA
Python微信库:itchat的用法详解
2017/08/14 Python
Python正确重载运算符的方法示例详解
2017/08/27 Python
Python实现删除时保留特定文件夹和文件的示例
2018/04/27 Python
python删除本地夹里重复文件的方法
2020/11/19 Python
Python 实现某个功能每隔一段时间被执行一次的功能方法
2018/10/14 Python
python模拟实现分发扑克牌
2020/04/22 Python
英国家具、照明、家居用品网上商店:Wayfair.co.uk
2020/02/13 全球购物
中学生演讲稿
2014/04/26 职场文书
公司总经理助理岗位职责
2014/07/09 职场文书
群众路线个人对照检查材料
2014/09/23 职场文书
助学感谢信范文
2015/01/21 职场文书
同事欢送会致辞
2015/07/31 职场文书
告诉你一个秘密:富人致富的五大优点
2019/07/11 职场文书
python urllib库的使用详解
2021/04/13 Python
利用JuiceFS使MySQL 备份验证性能提升 10 倍
2022/03/17 MySQL
Python使用openpyxl模块处理Excel文件
2022/06/05 Python