mysql通过group by分组取最大时间对应的数据,提供两种有效方法。
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 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;
查询结果正确:
思路:需要关联一张表,这个关联表t2中的数据是对原表t1按照上项目时间倒叙排列,注意,此处必须使用distinct,此处distinct的作用可以理解为将t1表数据顺序固定为t2表顺序。
主表GROUP BY 后会取出按条件分组后的第一条数据。
(补充:关联t2表,如果有查询条件,需要将所有查询条件都写在关联的t2表中,如果写在主表的where中排序就失效了。后来发现的~)
方法二:
-
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;
查询结果正确:
SUBSTRING_INDEX 用法:取排序后的分组的第一条数据。
本人习惯使用第一种方法。
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgghfcj
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13