mysql数据库 order by和limit未一起使用,导致数据排序功能无效【bug记录】

@记录mysql order by和limit未一起使用导致数据无效
首先解释一下遇到的数据库查询问题:
我在sql查询语句都是默认写order by和limit进行排序和分页,使用起来非常正常。但这次偶然遇到一个需求,需要查询所有数据,所以我将limit分页条件语句去掉,于是就出现order by 语句不论怎么写都不生效,所有数据都能正确地根据条件查询到,但数据的排序未按照order by 的规则,order by写了等于没写,被mysql直接忽略了。

下面是sql代码


        SELECT * FROM(          <!-- 总数信息,作为头部信息 -->
        (
        SELECT
        COUNT(1) AS id
        , NULL AS field_id, NULL AS book_by, NULL AS serial_code, NULL AS book_time_count
        , NULL AS book_time, NULL AS create_by, NULL AS update_by, NULL AS create_time
        , NULL AS update_time, NULL AS active ,NULL AS book_time_unit
        ,NULL AS field_area_code,NULL AS field_name,NULL AS field_type
        ,NULL AS price_unit,NULL AS field_img,NULL AS user_phone
        FROM field_book as T LEFT JOIN field T1 ON T.field_id = T1.id
        LEFT JOIN sys_user T2 ON T.book_by = T2.user_name
        WHERE ${ew.sqlSegment}
        )
        UNION
        (
        SELECT
        T.id
        , T.field_id, T.book_by, T.serial_code, T.book_time_count
        , T.book_time, T.create_by, T.update_by, T.create_time
        , T.update_time, T.active,T1.book_time_unit
        ,T1.field_area_code,T1.field_name,T1.field_type
        ,T1.price_unit,T1.field_img,T2.phonenumber
        FROM field_book as T LEFT JOIN field T1 ON T.field_id = T1.id
        LEFT JOIN sys_user T2 ON T.book_by = T2.user_name
        WHERE ${ew.sqlSegment}
        ORDER BY T.book_time
        ${ew.pageSql}
        )
        )AS T3
        ;

这段上面半块是查总数的,主要看UNION的下面半块代码,${ew.sqlSegment}是mybatisplus的wrapper原生的where语句输出方法,不重要
e w . p a g e S q l 则 是 单 纯 输 出 “ L I M I T 1 , 10 ” 的 分 页 语 句 现 在 这 段 s q l 所 查 数 据 的 问 题 就 在 于 , 如 果 {ew.pageSql}则是单纯输出“ LIMIT 1,10 ”的分页语句 现在这段sql所查数据的问题就在于,如果 ew.pageSqlLIMIT1,10sql{ew.pageSql}输出空串,不输出“ LIMIT 1,10 ”,也就是这段sql语句不分页查询,它上一行的order by也会跟着失效。
简而言之,limit和order by得一起混用,否则order by会离奇地失效。
解决办法是把limit加回去,写成比如limit 1 ,100000这样

PS:
关于${ew.sqlSegment},在mybatisplus源码里,ew通常代表wrapper实体,sqlSegment是一个官方封装好的方法,输出的字符串就是 sql ,是经过Wrapper拼凑的where语句在这里插入图片描述
此图是xml对应的dao层mapper中的一个接口
@Param( Constants.WRAPPER )这个注解,Constants.WRAPPER就是“ew”

排除所有其它原因以后,现在进入正题
关键就在这个 ${ew.pageSql} 的有和无,此方法是我自己写到wrapper里面的,作用只是输出sql的字符串
在这里插入图片描述

具体用法在服务层实现类通过setPage方法赋值,用法如下

这在这里插入图片描述

这是setPage方法的实现,
在这里插入图片描述

setPage这个方法3个入参中,第三个pageAble有默认值true,前端只需要把pageAble传入false,setPage就不执行, ${ew.pageSql}就会输出空串“”

至于SuperWrapper,是我写的一个比较好用的Wrapper封装,用法也很方便,我平常就这样在MVC服务层的实现写代码,如下

 SuperWrapper spWrapper = new SuperWrapper()

                //设置XML分页参数
                .setPage( params.getPageNum() , params.getPageSize() , params.getPageAble() )
                .ne( "T.active" , 0 );

        if ( param != null ) {

            spWrapper


                    //查询: 主键
                    .likes( "T2.phonenumber" , param.getUserPhone() )

                    .likes( "T.id" , param.getId() )

                    //查询: 场地编号
                    .likes( "T.field_id" , param.getFieldId() )

                    //查询: 预订者
                    .likes( "T.book_by" , param.getBookBy() )

                    //查询: 编号
                    .likes( "T.serial_code" , param.getSerialCode() )

                    //查询: 预订时段数(代表顺序向前多少时段)
                    .likes( "T.book_time_count" , param.getBookTimeCount() )

                    //查询: 预订时段
                    .likes( "T.book_time" , param.getBookTime() )

                    //查询: 创建用户
                    .likes( "T.create_by" , param.getCreateBy() )

                    //查询: 修改用户
                    .likes( "T.update_by" , param.getUpdateBy() )

                    //查询: 创建时间
                    .likes( "T.create_time" , param.getCreateTime() )

                    //查询: 修改时间
                    .likes( "T.update_time" , param.getUpdateTime() )

                    //查询: 激活/删除状态
                    .likes( "T.active" , param.getActive() )

                    .betweens( "T.create_time" , param.getTimeRange() )
            ;
                spWrapper.betweens( "T.book_time", bookDay );
                
        List< FieldBookDataVo > DTOList = fieldBookMapper.query( spWrapper );

我后续还会继续写关于我的SuperWrapper的奇特用法,比如很多个wrapper放进同一个wrapper里面,生成非常复杂的复合sql语句,想进一步了解可以互相学习关注一下

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值