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 InnoDB存储引擎的内存管理
Apr 08 MySQL
MySQL索引知识的一些小妙招总结
May 10 MySQL
MySQL优化之如何写出高质量sql语句
May 17 MySQL
SQL实战演练之网上商城数据库商品类别数据操作
Oct 24 MySQL
MySQL中int (10) 和 int (11) 的区别
Jan 22 MySQL
MySQL数据库⾼可⽤HA实现小结
Jan 22 MySQL
解决MySQL添加新用户-ERROR 1045 (28000)的问题
Mar 03 MySQL
讲解MySQL增删改操作
May 06 MySQL
mysql字段为NULL索引是否会失效实例详解
May 30 MySQL
mysql sql常用语句大全
Jun 21 MySQL
MySQL控制流函数(-if ,elseif,else,case...when)
Jul 07 MySQL
MySQL中的 inner join 和 left join的区别解析(小结果集驱动大结果集)
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中使用explode查找某个字符是否存在的方法
2011/07/12 PHP
函数中使用require_once问题深入探讨 优雅的配置文件定义方法推荐
2014/07/02 PHP
php使用pclzip类实现文件压缩的方法(附pclzip类下载地址)
2016/04/30 PHP
PHP实现文件上传下载实例
2016/10/18 PHP
PHP实现文件下载【实例分享】
2017/04/28 PHP
javascript游戏开发之《三国志曹操传》零部件开发(三)情景对话中仿打字机输出文字
2013/01/23 Javascript
Extjs中RowExpander控件的默认展开问题示例探讨
2014/01/24 Javascript
JavaScript实现找质数代码分享
2015/03/24 Javascript
实现前后端数据交互方法汇总
2015/04/07 Javascript
微信小程序模板之分页滑动栏
2017/02/10 Javascript
JavaScript实现计算圆周率到小数点后100位的方法示例
2018/05/08 Javascript
js正则相关知识点专题
2018/05/10 Javascript
小程序实现人脸识别功能(百度ai)
2018/12/23 Javascript
vue-router实现嵌套路由的讲解
2019/01/19 Javascript
微信小程序实现获取小程序码和二维码java接口开发
2019/03/29 Javascript
[46:58]完美世界DOTA2联赛PWL S3 Forest vs LBZS 第一场 12.17
2020/12/19 DOTA
Python中bisect的用法
2014/09/23 Python
Python分支结构(switch)操作简介
2018/01/17 Python
python如何对实例属性进行类型检查
2018/03/20 Python
Python查找数组中数值和下标相等的元素示例【二分查找】
2019/02/13 Python
Django 外键的使用方法详解
2019/07/19 Python
详解Anconda环境下载python包的教程(图形界面+命令行+pycharm安装)
2019/11/11 Python
基于Tensorflow高阶读写教程
2020/02/10 Python
python实现感知机模型的示例
2020/09/30 Python
CSS3的文字阴影—text-shadow的使用方法
2012/12/25 HTML / CSS
No7 Beauty美国官网:英国国民护肤品牌
2019/10/31 全球购物
员工薪酬福利制度
2014/01/17 职场文书
学风建设演讲稿
2014/09/12 职场文书
解除劳动合同协议书(样本)
2014/10/02 职场文书
幼儿园欢迎词范文
2015/01/26 职场文书
2015年小学数学教研组工作总结
2015/05/21 职场文书
班主任培训研修日志
2015/11/13 职场文书
大学迎新生的欢迎词
2019/06/25 职场文书
深入理解Vue的数据响应式
2021/05/15 Vue.js
一次SQL如何查重及去重的实战记录
2022/03/13 MySQL
box-shadow单边阴影的实现
2023/05/21 HTML / CSS