mysql limit 排序_采坑笔记——mysql的order by和limit排序问题

本文记录了一个关于MySQL查询的常见错误,当使用ORDER BY和LIMIT时,如果将LIMIT放在外部查询,可能会导致预期的排序结果失效。通过分析和实验,作者发现LIMIT操作可能会影响MySQL的查询优化,导致联表查询结果不按预期的ORDER BY排序。解决方案是将ORDER BY和LIMIT操作放在最外层查询中,以确保正确排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景说明

今天写出一个十分弱智的bug,记录一下,提醒自己以后别这种犯错,不怕丢人哈~

在写一个分页查询记录的sql时,要根据添加的时间逆序分页输出,之前的写法是酱紫

select

record.a,

y.c

from

(

select

a,b

from

x

order by timestamp desc

limit 0,10

) record

left join y

on record.b = y.d;

因为一些新的需求,要在后面加一些where条件,limit操作不能在嵌套查询里面加了,于是乎把limit 0,10提出来放到最外面,结果order by还留在里面,我当时想嵌套查询出来的record表已经按timestamp字段逆序排列了,再left另一张表,最终再limit出来的结果应该也是逆序的,但结果却很打脸,是正序的。

分析原因

首先控制变量,代码回滚到之前,把后来加的各种逻辑都去掉,还原到上述sql,只把limit 0,10移到最后,发现timestamp是正序的,那么问题应该就出在这里了,与后来加的其他逻辑没有关系。

那么再试一下删掉limit操作,结果timestamp是无序的!这不可能啊,于是认真看了下数据,发现一些规律,可能是按y表的自增id或created_at时间字段排序的(因为这两个字段是索引字段),那么到这里,我们至少可以得到一个简单的结论,就是联表查询结果,不是按照嵌套查询中的order by排序的,现在正向一看,确实不可能按这个排序,因为括号里面的逻辑对括号外是不可见的。

还有个问题,上述去掉limit后,最终不是按left join主表的顺序输出,按照我们常理想象,mysql是循环主表的记录去关联另一张表,那么输出的顺序应该还是主表的顺序啊,但结果却是按另一张表的字段排序的,这又是为什么呢?

去官方手册中找找线索,发现o

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值