你知道吗,MySQL 多字段排序有陷阱!

优秀的程序员必须注重细节。如果对细节不够了解,就一定会出现问题。回顾自己闯下的线上故障,我发现所有的问题都是疏忽在细节上。

这不,上周我差点又闯祸。,最近有一个新需求,允许用户一次性购买多份商品。开发过程很顺利,但在测试阶段,测试同事发现了一个问题,即履约记录的展示顺序出错了。在管理后台页面上,应该按照履约时间的倒序展示履约记录------也就是说,最近的履约记录应该显示在最前面。然而现在却展示成了正序,先显示几个月前的履约记录,这肯定是不对的。

我百思不得其解,因为我明明没有修改成正序,为什么会出问题呢?我急忙开始排查问题。

去掉一些无关的细节后,有问题的 SQL 大概是这样的。

❌ 错误的写法

sql 复制代码
Select * from perform_records Where user_id = #{userId} Order By created_time, id desc;

原本只需按照 created_time 倒序排序,但是当出现多条记录的 created_time 相同时,为了避免分页展示时重复展示的问题,我决定在排序字段中加入id。现在的排序字段变为 order by created_time, id desc,我的设想是先按照 created_time 倒序展示,如果 created_time 相同,则按照id 的倒序展示。

排序字段加上 id 后,变为Order By created_time, id desc;,我设想是先按照 created_time 倒序展示,如果 created_time 相同,则按照 id 倒序展示。

然而,结果却出乎意料,展示的效果完全相反,变成了按照履约时间的正序展示!

✅ 正确的写法

Order BY 支持多字段排序,如果选择多字段排序,则需要分别指定各字段的排序方式,如果不指定则默认为增序。

正确的办法是:分别指定 created_time 和 id 的排序方式。

Order By created_time desc , id desc;

因为我没有明确指定 created_time 的排序方式,默认采用了正序排列,导致了文章开头出现的问题。

我相信这个问题不仅我犯过,其他人也可能犯过类似的错误,过于自以为是地认为......

自从做互联网电商业务后,很久没有写复杂的 SQL,遇到复杂的 SQL 就得上百度搜一下。不知道大家有没有同感?

例如SQL 中的 ORDER BY 和 Limit 谁应该写前面?

相关推荐
摇滚侠6 小时前
《SpringBoot 3:入门与应用实战》第 12 章 JDBC 与事务 使用 JdbcTemplate 阅读笔记 32
spring boot·笔记·后端
步行cgn8 小时前
@Configuration 详解:Spring 配置类的核心注解
java·后端·spring
桦说编程9 小时前
【AtomicAgent系列1】变异测试——过去做不起,现在 agent 做得起
后端·ai编程·vibecoding
考虑考虑10 小时前
nginx打印请求日志
运维·后端·nginx
IT_陈寒11 小时前
Python的切片赋值把我坑惨了,这不是bug是特性
前端·人工智能·后端
CoderLiu11 小时前
程序化工具调用(PTC)与动态工作流引擎:深入大模型工具调用的架构演进与实践
前端·人工智能·后端
fireworks9911 小时前
SpringBoot2接入Knife4j
后端
wei_shuo11 小时前
数据迁移工具实战:KDMS自动化评估与量化决策体系解析
后端
Lightpwd12 小时前
Spring Boot 多数据源落地:AbstractRoutingDataSource + 注解切面(附源码)
数据库·后端
乱码三千12 小时前
使用ComfyUI+MinMax-H3音视频模型生成视频
前端·后端·github