V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
daimubai
V2EX  ›  Java

PageHelper 分页后再排序问题

  •  
  •   daimubai · 2021-06-27 22:03:51 +08:00 · 2276 次点击
    这是一个创建于 1247 天前的主题,其中的信息可能已经有所发展或是发生改变。

    大家好,我目前遇到的问题是 PageHelper 分页后再排序会出现顺序错乱的问题:

    PageHelper 也可以实现排序,不过它只能对表中的数据直接排序,我现在的需求是对非表中的数据进行排序,需要先分页后,然后对 list 进行 sort,但是这样的问题是:比如分页后对 price 排序,会存在第二页数据的 price 比第一页数据的 price 小的情况。

    我想到的解决办法是全查出来,然后逻辑分页。。。不过数据量大肯定不行了,不知道有没有大佬遇到过这种问题,有的话帮忙解答一下,请喝奶茶!

    17 条回复    2021-06-29 13:07:05 +08:00
    Cbdy
        1
    Cbdy  
       2021-06-27 22:19:32 +08:00   ❤️ 1
    写个 SQL 不好吗?

    SELECT *
    FROM price_table
    ORDER BY price ASC
    LIMIT 20 OFFSET 10;
    daimubai
        2
    daimubai  
    OP
       2021-06-27 22:22:02 +08:00
    @Cbdy 可能我没有表述清楚,这个 price 不是表中的数据,假设是一个需要通过查出来的数据计算出来的值,所以无法在 sql 中排序
    daimubai
        3
    daimubai  
    OP
       2021-06-27 22:24:09 +08:00
    @Cbdy 比如 表中有 a b c 三个字段,我的需求是根据 c 通过公式得出来的 d 排序,因此无法使用 sql 排序,因为 d 不在表中,而且我需要先查出来数据才能知道 d,但是这样就是会有第二页的 d 比第一页的 d 小的情况
    fengpan567
        4
    fengpan567  
       2021-06-27 22:24:18 +08:00   ❤️ 1
    手写 sql,连表查询。pagehelper 也支持手写的 sql 分页。
    daimubai
        5
    daimubai  
    OP
       2021-06-27 22:25:23 +08:00
    @fengpan567 大佬,您看下, 比如 表中有 a b c 三个字段,我的需求是根据 c 通过公式得出来的 d 排序,因此无法使用 sql 排序,因为 d 不在表中,而且我需要先查出来数据才能知道 d,但是这样就是会有第二页的 d 比第一页的 d 小的情况
    fengpan567
        6
    fengpan567  
       2021-06-27 22:26:33 +08:00   ❤️ 1
    @daimubai 建议你搞个字段把价格存起来,或者 sql 里把价格公式带进去。
    daimubai
        7
    daimubai  
    OP
       2021-06-27 22:27:38 +08:00
    @fengpan567 存起来这个我考虑下,因为我需要排序的字段很多,都需要公式,而且公式用到了工具类,挺复杂
    daimubai
        8
    daimubai  
    OP
       2021-06-27 22:28:18 +08:00
    @daimubai 所以我想的是查出来然后通过 list 的 sort 排序能不能实现,也更灵活一点
    daimubai
        9
    daimubai  
    OP
       2021-06-27 22:30:05 +08:00
    @fengpan567 好像存起来也不行,因为不同用户计算的结果也不一样,,,
    fengpan567
        10
    fengpan567  
       2021-06-27 22:31:03 +08:00
    @daimubai 不能这么搞,数据量大服务会崩掉
    xuanbg
        11
    xuanbg  
       2021-06-27 23:29:31 +08:00
    @daimubai 数据不大的话,也可以直接用计算结果排序。数据大的话,还是加一计算结果字段,专门用来排序好了。
    cslive
        12
    cslive  
       2021-06-28 09:27:02 +08:00
    SELECT RANK() over (order by (a+b) desc ) as rank from price_table
    </br>
    直接排序完完事
    qwerthhusn
        13
    qwerthhusn  
       2021-06-28 09:57:06 +08:00
    PageHelper 分页做的很暴力,查询 Count 的时候就是把你 SQL 外面套一层 select count(*) from (你的 SQL)
    YzSama
        14
    YzSama  
       2021-06-28 10:08:20 +08:00
    楼上基本答案都告诉你了,

    要快加个字段。
    否则,先计算再分页。 分页在计算肯定不行的咯。
    yazinnnn
        15
    yazinnnn  
       2021-06-28 10:21:14 +08:00
    你有没有考虑过是你的需求有问题呢
    cobainlu
        16
    cobainlu  
       2021-06-29 13:05:16 +08:00
    PageHelper.startPage(vo.getPageNum(),vo.getPageSize());
    return PageUtil.getPageVO(sysLogMapper.selectAll(vo));
    cobainlu
        17
    cobainlu  
       2021-06-29 13:07:05 +08:00
    PageHelper.startPage(pagenum,pageSize);
    //进行排序
    List=dao.select();
    return PageUtil.getPageVO(list);
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3038 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 14:38 · PVG 22:38 · LAX 06:38 · JFK 09:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.