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 分组查询的优化方法
May 12 MySQL
MySQL 重命名表的操作方法及注意事项
May 21 MySQL
探究Mysql模糊查询是否区分大小写
Jun 11 MySQL
MySQL快速插入一亿测试数据
Jun 23 MySQL
使用ORM新增数据在Mysql中的操作步骤
Jul 26 MySQL
MySQL连接控制插件介绍
Sep 25 MySQL
MySQL中datetime时间字段的四舍五入操作
Oct 05 MySQL
SQL实战演练之网上商城数据库商品类别数据操作
Oct 24 MySQL
全面盘点MySQL中的那些重要日志文件
Nov 27 MySQL
MySQL 逻辑备份 into outfile
May 15 MySQL
mysql 排序失效
May 20 MySQL
数据设计之权限的实现
Aug 05 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中get_headers函数的作用及用法的详细介绍
2013/04/27 PHP
常见PHP数据库解决方案分析介绍
2015/09/24 PHP
php远程请求CURL实例教程(爬虫、保存登录状态)
2020/12/10 PHP
用js实现的页面关键字密度查询代码
2007/12/27 Javascript
通过JS来判断页面控件是否获取焦点
2014/01/03 Javascript
JavaScript跨平台的开源框架NativeScript
2015/03/24 Javascript
浅谈Javascript数组索引
2015/07/29 Javascript
jquery实现倒计时功能
2015/12/28 Javascript
JS中script标签defer和async属性的区别详解
2016/08/12 Javascript
angular和BootStrap3实现购物车功能
2017/01/25 Javascript
jQuery实现的简单在线计算器功能
2017/05/11 jQuery
Nodejs 和Session 原理及实战技巧小结
2017/08/25 NodeJs
JS实现音量控制拖动
2020/01/15 Javascript
[46:37]LGD vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
零基础写python爬虫之爬虫框架Scrapy安装配置
2014/11/06 Python
Python中用于转换字母为小写的lower()方法使用简介
2015/05/19 Python
Tensorflow实现神经网络拟合线性回归
2019/07/19 Python
python提取xml里面的链接源码详解
2019/10/15 Python
python GUI库图形界面开发之PyQt5拖放控件实例详解
2020/02/25 Python
Python自动登录QQ的实现示例
2020/08/28 Python
Pytorch实验常用代码段汇总
2020/11/19 Python
css3 2D图片转动样式可以扩充到Js当中
2014/04/29 HTML / CSS
详解canvas在圆弧周围绘制文本的两种写法
2018/05/22 HTML / CSS
HTML5 Canvas中使用路径描画二阶、三阶贝塞尔曲线
2015/01/01 HTML / CSS
Nike法国官方网站:Nike.com FR
2018/07/22 全球购物
荷兰家电销售网站:Welhof
2020/12/08 全球购物
如何用PHP实现邮件发送
2012/12/26 面试题
简单叙述一下MYSQL的优化
2016/05/09 面试题
应届生会计电算化求职信
2013/10/03 职场文书
职务任命书范本
2014/06/05 职场文书
村班子对照检查材料
2014/08/18 职场文书
私人房屋买卖协议书
2014/10/04 职场文书
2015年办公室个人工作总结
2015/04/20 职场文书
2015年农村党员公开承诺事项
2015/04/28 职场文书
2019关于垃圾分类处理的调查报告
2019/12/26 职场文书
元素水平垂直居中的方式
2021/03/31 HTML / CSS