iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >mysql通过group by分组取最大时间对应的数据,提供两种有效方法。
  • 871
分享到

mysql通过group by分组取最大时间对应的数据,提供两种有效方法。

sql数据库java 2023-09-03 14:09:23 871人浏览 泡泡鱼
摘要

1、项目记录表project_record的结构和数据如下: 以下为项目记录表project_record的所有数据。project_id为项目Id,on_project_time为上项目时间。(每一条数据代表着上某个项目(project

1、项目记录表project_record的结构和数据如下:

以下为项目记录表project_record的所有数据。project_id为项目Id,on_project_time为上项目时间。(每一条数据代表着上某个项目(project_id)的时间(on_project_time)记录)

2、我们的需求是:取出每个项目中最大上项目时间对应的那条数据。(即根据project_id分组,取出每组中最大的on_project_time对应的数据。)上方红框是我们要查出的数据

3、错误代码:

SELECT * FROM (SELECT * FROM project_record order by on_project_time desc) t GROUP BY project_id;

查询结果错误:

结果看似正确的,实则是错误的。每个项目最大的上项目时间能正确查出,但是数据对应的id不正确。

分析发现,对于每一个分组,分组后的结果总是取组中主键(id)最小的数据,即group by project_id 总会对project_id执行排序(正序)

 而不论临时表(t)中是否已排序,都会取组中主键id最小的一行数据。换句话说 临时表t 内的排序 无法影响外层的group by 的操作。

4、 正确方法如下:

方法一:

SELECT t1.*FROM project_record t1INNER JOIN (SELECT DISTINCT(id) idFROM project_record ORDER BY on_project_time DESC) AS t2 ON t2.id = t1.idGROUP BY t1.project_id;

查询结果正确:

思路:需要关联一张表,这个关联表t2中的数据是对原表t1按照上项目时间倒叙排列,注意,此处必须使用distinct,此处distinct的作用可以理解为将t1表数据顺序固定为t2表顺序
主表GROUP BY 后会取出按条件分组后的第一条数据。

补充:关联t2表,如果有查询条件,需要将所有查询条件都写在关联的t2表中,如果写在主表的where中排序就失效了。后来发现的~

 

方法二:

select t1.*FROM project_record t1INNER JOIN (SELECT SUBSTRING_INDEX(GROUP_CONCAT(id ORDER BY on_project_time DESC),',',1) AS idFROM project_record GROUP BY project_id) AS t2 ON t2.id = t1.id;

查询结果正确:

SUBSTRING_INDEX 用法:取排序后的分组的第一条数据。 

本人习惯使用第一种方法。

来源地址:https://blog.csdn.net/lucky_she_niu/article/details/125933085

您可能感兴趣的文档:

--结束END--

本文标题: mysql通过group by分组取最大时间对应的数据,提供两种有效方法。

本文链接: https://www.lsjlt.com/news/392322.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作