分页时order by的问题

本文详细介绍了在数据库分页查询中遇到的问题及解决方案。当取样时间相等导致排序混乱时,通过增加唯一字段进行二次排序,有效解决了数据错位问题。

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

      做了一个分页,按照取样时间排序。

Select * from (select ROWNUM RN,X.*
        from (
            select s.* from T_TEST_SAMPLE s
            <where> 
                <if test="qualityName!=null and qualityName!=''">
                    AND TRIM(s.sample_name) = #{qualityName,jdbcType=VARCHAR}
                </if>
                <if test="begin!=null ">
                    and SAMPLING_DATE &gt;= #{begin,jdbcType=TIMESTAMP}
                </if>
                <if test="end!=null ">
                    AND SAMPLING_DATE &lt;= #{end,jdbcType=TIMESTAMP}
                </if>
            </where>
            order by s.SAMPLING_DATE desc
        ) X
        where ROWNUM &lt;= #{endIndex,jdbcType=INTEGER}
        ) Z
        where RN &gt; #{offset,jdbcType=INTEGER}

      最近,业务流程改变了,取样时间存在相等的情况了。

 

      后来,查询好几天的信息,就出现了一种情况。第三页的最后两条出现在了第四页的最前两条。

      后来想了一下,估计是因为取样时间相等的数据过多,导致排序乱了,就用了一个不可能重复的字段排序。

            order by s.SAMPLING_DATE desc,id desc

      这下情况正常了~

 

      这篇文章讲的非常好:

https://www.cnblogs.com/lwlxqlccc/p/8676045.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值