Mysql5.7版本中,查询分组GROUP BY通过子查询中ORDER BY进行排序无效的问题解决办法

文章目录

一、场景:

问题描述:Mysql5.7版本中,查询分组GROUP BY通过子查询中ORDER BY进行排序无效的问题解决办法。

应用场景:一对多的关系,通常需要取最新、最近的一条数据时。

举例:比如客户表,订单表,一个客户可能有很多订单,一对多的关系,我们想查询每个客户最新的一单数据

客户id 姓名
1001 客户张三
1002 客户李四
订单id 客户id 下单时间
1 1001 2023-11-10 15:20:00
2 1001 2023-11-11 15:10:00
3 1002 2023-09-11 12:20:00
4 1003 2023-10-11 14:20:00
5 1003 2023-12-11 20:20:00
6 1003 2023-12-21 14:20:00

常规操作:尝试使用子查询,先排序再分组,取最新一条

java 复制代码
SELECT * FROM ( SELECT  *  FROM `order_info` ORDER  BY created_time desc ) AS t GROUP  BY customer_id 

但是这个方式在低版本中有效,

在 5.7 版本中引入新特性 derived_merge 优化过后,group by子句中使用order by导致order by失效,所以你发现取到的不是最新的!

二、解决办法

1、使用 having 来阻止合并

java 复制代码
SELECT * FROM ( SELECT  *  FROM `order_info` HAVING  1=1  ORDER  BY created_time desc ) AS t GROUP  BY customer_id 

2、足够大的limit

用一个超级大的limit放在order by后面

java 复制代码
SELECT * FROM ( SELECT  *  FROM `order_info` ORDER  BY created_time desc   LIMIT 1000000 ) AS t GROUP  BY customer_id 

3、子查询

一些场景,如果是有序递增的,可以通过取Max(id)方式,实现效果

java 复制代码
SELECT * FROM  order_info where order_id in ( SELECT MAX( order_id ) FROM order_info GROUP  BY customer_id )

取到最新的数据在关联客户表查询即可。

上边提到了取最新、最近数据的可试方法,那还有一种常见场景是删除重复的记录(只保留一条)怎么处理呢:SQL删除重复的记录(只保留一条)-窗口函数row_number()

相关推荐
一颗宁檬不酸5 小时前
文件管理知识点
数据库
5 小时前
达梦数据库-事务
数据库·达梦数据库·dm
网硕互联的小客服6 小时前
MYSQL数据库和MSSQL数据库有什么区别?分别适用于什么脚本程序?
数据库·mysql·sqlserver
weixin_462446237 小时前
【原创实践】python 获取节假日列表 并保存为excel
数据库·python·excel
计算机毕设匠心工作室7 小时前
【python大数据毕设实战】全球大学排名数据可视化分析系统、Hadoop、计算机毕业设计、包括数据爬取、数据分析、数据可视化、机器学习、实战教学
后端·python·mysql
千寻技术帮7 小时前
10413_基于Springboot的智慧养老院管理系统
spring boot·mysql·源码·安装·文档·ppt·养老院
RPA 机器人就找八爪鱼7 小时前
RPA 赋能银行数字化转型:四大核心应用场景深度解析
数据库·人工智能·rpa
掂掂三生有幸7 小时前
使用openGauss搭建一个监狱管理系统
数据库
VX:Fegn08957 小时前
计算机毕业设计|基于Java人力资源管理系统(源码+数据库+文档)
java·开发语言·数据库·vue.js·spring boot·后端·课程设计
siriuuus7 小时前
Redis 安装、多实例部署、主从复制及 Cluster 实践
数据库·redis·centos