千家信息网

MySql Group by函数怎么正确使用

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要介绍了MySql Group by函数怎么正确使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MySql Group by函数怎么正确使用文章都会有所收获,
千家信息网最后更新 2026年10月31日MySql Group by函数怎么正确使用

这篇文章主要介绍了MySql Group by函数怎么正确使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MySql Group by函数怎么正确使用文章都会有所收获,下面我们一起来看看吧。

在使用分组函数时, 进行结果集筛选, 遇到的一些问题以及解决办法

1. 应用场景

有两张表

文章表(一对多留言表) t_posts:
oid, posts_name
留言表(多对一文章表) t_comment:
oid, posts_id, msg_content, create_time

2.需求分析

查询每个文章的最新回复内容

3.SQL编写

select   tp.oid,  tp.posts_name,  tc.msg_content,  tc.create_timefrom t_posts tp left join t_comment tc on tp.oid = tc.posts_idgroup by tp.oid having create_time = max(create_time)

假设现在有两个文章A, B (回复的记录在数据库的顺序与下述一致)


A有一个回复记录时间为: 2019-09-10
A有一个回复记录时间为: 2019-09-11
B有一个回复记录时间为: 2019-09-01
B有一个回复记录时间为: 2019-09-09

运行上面的sql, 会发现结果集丢失大量记录, 并且结果是错误的, 经过查询资料得知

mysql的 having 是在 group by 之后再执行, 也就是说, 先分组, 在过滤, 但是因为存在两条以上的留言记录,
所以分组之后的结果集只会取每条留言的第一条作为分组之后的记录信息, 这时如果使用having create_time = max(create_time)
那么, max(create_time) 为当前分组的最大时间

为: 2019-09-10 和 2019-09-09

所以上述sql会丢失结果集

4.改造SQL

因为知道分组之后合并的重复结果集为rownum最小的那条, 那么可不可以改造sql如下??

select   tp.oid,  tp.posts_name,  tc.msg_content,  tc.create_timefrom t_posts tp left join t_comment tc on tp.oid = tc.posts_idgroup by tp.oid having create_time = max(create_time)-- 下面的是新增的sqlorder by tc.create_time desc

运行之后发现依旧不好使, 证明order by 在group by & having 之后

后来想想可不可以 不用having, 直接用order by来优化分组后的结果呢?

having create_time = max(create_time)

select   tp.oid,  tp.posts_name,  tc.msg_content,  tc.create_timefrom t_posts tp left join t_comment tc on tp.oid = tc.posts_idgroup by tp.oid order by tc.create_time desc

结果集错误, 并不能影响分组结果, 依旧是按照rownum最小分组合并重复结果集, 然后在排序

5.终极改造版本

因为order by 只能后影响group by, 那么是不是可以在group by 之前先把结果集排序一下, 然后再分组呢?

select * from (  select     tp.oid,    tp.posts_name,    tc.msg_content,    tc.create_time  from t_posts tp   left join t_comment tc on tp.oid = tc.posts_id  order by tc.create_time desc) t group by t.oid

发现还是不好使, 但是子查询确实先排序了

经查询(explain), 发现子查询的order by被优化没了, 解决办法:

  1. 在子查询里使用limit 99999

  2. 在子查询里使用where条件, create_time = (select max(create_time) from t_comment group by oid)

select * from (  select     tp.oid,    tp.posts_name,    tc.msg_content,    tc.create_time  from t_posts tp   left join t_comment tc on tp.oid = tc.posts_id  order by tc.create_time desc limit 9999) t group by t.oid

大功告成

附加知识点:

mysql5.5 与 mysql 5.7 版本差异: 5.7+ 版本, 如果不使用 limit, group by 会把 order by 优化掉

关于"MySql Group by函数怎么正确使用"这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对"MySql Group by函数怎么正确使用"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。

结果 分组 查询 函数 文章 时间 知识 内容 版本 排序 改造 最小 可不 不好 办法 篇文章 错误 面的 运行 一致 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 A股互联网金融科技公司 互联网医疗科技 华宇互联网科技 融势互联网科技 互联网金融 科技创新 互联网汽车科技小镇 深圳前海聚择互联网科技有限公司 湖南诚度互联网科技有限公司 栖莱科技互联网股份有限公司 来此购互联网科技有限公司 青岛科技大学互联网大赛研究生 互联网科技圈年度人物 高科技互联网套路 中国互联网有什么科技 美国互联网科技公司 领航科技大厦互联网公司 互联网科技融合创新 九思连强互联网电子科技有限公司 宁波跨境商互联网科技有限公司 科技互联网公司两年变化 互联网核心科技是什么 以房互联网科技 鑫亿盛互联网科技 互联网科技公司有哪些 四川狮子座互联网科技 现代科技和互联网有关系吗 南山科技园互联网公司有哪些 山东星卡互联网科技有限公司官网 重庆科技产业互联网有哪些 宁波允成互联网科技有限公司
0