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 Show Profile
Apr 05 MySQL
MySQL CHAR和VARCHAR该如何选择
May 31 MySQL
mysql如何配置白名单访问
Jun 30 MySQL
Prometheus 监控MySQL使用grafana展示
Aug 30 MySQL
MySQL数据库超时设置配置的方法实例
Oct 15 MySQL
mysql分表之后如何平滑上线详解
Nov 01 MySQL
深入讲解数据库中Decimal类型的使用以及实现方法
Feb 15 MySQL
面试中老生常谈的MySQL问答集锦夯实基础
Mar 13 MySQL
MySQL 条件查询的常用操作
Apr 28 MySQL
delete in子查询不走索引问题分析
Jul 07 MySQL
MySQL事务的隔离级别详情
Jul 15 MySQL
Mysql中mvcc各场景理解应用
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面试常用算法(推荐)
2016/07/22 PHP
thinkPHP5框架实现基于ajax的分页功能示例
2018/06/12 PHP
javascript 字符 Escape,encodeURI,encodeURIComponent
2009/07/09 Javascript
JavaScript创建一个欢迎cookie弹出窗实现代码
2013/03/15 Javascript
JS 去前后空格大全(IE9亲测)
2013/07/15 Javascript
jquery 利用show和hidden实现级联菜单示例代码
2013/08/09 Javascript
js和html5实现手机端刮刮卡抽奖效果完美兼容android/IOS
2013/11/18 Javascript
基于jquery扩展漂亮的CheckBox(自己编写)
2013/11/19 Javascript
SeaJS入门教程系列之使用SeaJS(二)
2014/03/03 Javascript
JS、DOM和JQuery之间的关系示例分析
2014/04/09 Javascript
js触发select onchange事件的小技巧
2014/08/05 Javascript
JS应用正则表达式转换大小写示例
2014/09/18 Javascript
jQuery实现在最后一个元素之前插入新元素的方法
2015/07/18 Javascript
jQuery Mobile 触摸事件实例
2016/06/04 Javascript
jQuery实现背景滑动菜单
2016/12/02 Javascript
基于input框覆盖掉数字英文的实例讲解
2017/07/21 Javascript
微信小程序动态生成二维码的实现代码
2018/07/25 Javascript
Vue项目路由刷新的实现代码
2019/04/17 Javascript
[04:42]2015国际邀请赛CDEC战队晋级之路
2015/08/13 DOTA
Python实现统计英文文章词频的方法分析
2019/01/28 Python
详解Python中正则匹配TAB及空格的小技巧
2019/07/26 Python
python监控nginx端口和进程状态
2019/09/06 Python
Flask之pipenv虚拟环境的实现
2019/11/26 Python
关于numpy数组轴的使用详解
2019/12/05 Python
Django values()和value_list()的使用
2020/03/31 Python
python实现粒子群算法
2020/10/15 Python
深入剖析webstorage[html5的本地数据处理]
2016/07/11 HTML / CSS
世界上最好的帽子:Tilley
2016/11/27 全球购物
大学班长的职责
2014/01/27 职场文书
大学生活动策划方案
2014/02/10 职场文书
大学生村官演讲稿
2014/04/25 职场文书
2014年安全管理工作总结
2014/12/01 职场文书
2015年国际护士节演讲稿
2015/03/18 职场文书
为什么node.js不适合大型项目
2021/04/28 Javascript
MySQL数据迁移相关总结
2021/04/29 MySQL
uwsgi+nginx代理Django无法访问静态资源的解决
2021/05/10 Servers