mysql中的group by问题
GROUP BY 语句根据一个或多个列对结果集进行分组。在分组的列上我们可以使用 COUNT, SUM, AVG,等函数。
SELECT column_name, aggregate_function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name
在 MySQL 中,不加聚合函数的情况下,返回的结果是分组后每组结果集中的第一行;如果打开相关配置,选择的字段不必在 GROUP BY 中存在(注意:mysql8中该配置默认是关闭的,即:必须在 GROUP BY 中出现)。
如果在SELECT语句中使用GROUP BY子句,而不使用聚合函数,则GROUP BY子句的行为与DISTINCT子句类似。
SELECT Froute_code FROM db_ccm_cx.t_ride_record_201807 GROUP BY Froute_code
返回的结果是分组后每组结果集中的第一行,但如果我们是想返回重复 Froute_code 中最新的一条,就需要借助排序了(例如:根据ID或时间倒序),但直接在原sql上加order by 语句是不生效的,因为 GROUP BY 会比 ORDER BY 先执行,没有办法在 GROUP BY 的各个 group 中进行针对某一列的排序。
只要在 GROUP BY 前将顺序调整好,把你希望的数据排在最前面,那么 GROUP BY 时就能顺利取到这个数据。故解决方法就是先进行你想要的排序,然后在此排序后的结果集的基础上,进行 GROUP BY 操作。比如下面 SQL:
对于mysql5.5版本:
select * from ( select * from table_name order by create_time desc ) as t group by t.id;
对于mysql 5.7及以上版本,需要加入limit限制,否则不生效
select * from ( select * from table_name order by create_time desc limit 100000 ) as t group by t.id;
但是这种写法如果数据量大于Limit 的值后,结果就不准确了。所以我们看第二种写法。
利用max() 函数:(根据业务,亲测不是MAX(id)结果不准确)
SELECT * FROM tb_dept td,(SELECT max(id) id FROM tb_dept GROUP BY parent_id) md where td.id = md.id;
利用 where 字段名称 in (...) 函数(但是不宜过长,有说in有个数限制,1000个,也有提到in本身没有限制,但是sql本身长度是有限制的max_allowed_packet,默认是4M。我还没有验证,在此先记录一下):
SELECT * FROM tb_dept WHERE id IN (SELECT MAX(id) FROM tb_dept GROUP BY parent_id);
参考文章:
https://blog.csdn.net/qq_39706515/article/details/126297233
https://www.jb51.net/article/250825.htm
https://zhuanlan.zhihu.com/p/271103544
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架