我们的分页方式大致如下(以Oracle为例):
1. 获取符合“条件1”的总记录数
select count(*) from T where 条件1
2. 利用Oracle的rownum获取指定页的数据,在“?”处指定起始行号和结束行号
select * from ( select row_.*, rownum rownum_ from ( SELECT * FROM T where 条件1) row_ where rownum <=?) where rownum_ > ?起始行号和结束行号的值,需要总记录数、每页行数、当前页号才能计算得出(后两者通过参数直接获取),因此使用了第一步来查询总记录数。不知道大家的分页是如何做的,是否可以一次查询直接得到结果,或者,有何种方式可进一步提高效率?望不吝赐教!

解决方案 »

  1.   

    可以用Hibernate做,应该可以简单点吧!
      

  2.   

    按有几个群,你不妨加进去,可以和大家一起讨论啊.........46986340,28039577,4804620                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
    在那里看看有无能回答你的,谢谢,LZ,甭忘了给俺分哦,谢谢LZ
      

  3.   

    你的select count(*) from T where 条件1 这一个查询只需要查询一次,然后把结果保存起来.在不更换条件分页的时候可以公用.
      

  4.   

    如果一次查询直接得到结果,那么当你点击第n页的时候就要判断count是否已经赋值,其实无形中增加了查询负担,只是貌似第一次简单一些而已
      

  5.   

    Hibernate通过setFirstResult和setMaxResults来设置行记录,OracleDialect内实现了getLimitString来使用rownum。在setFirstResult时,仍然需要总记录数来计算起始行
      

  6.   

    那就要直接在查询数据的时候同时差出count了,其实count很快的。哈哈
      

  7.   

    select count(*) 比 select *  要快很多,可以忽略不计。
      

  8.   

    select count(1)
    要比
    select count(*)快特别是字段较多的时候
      

  9.   

    pagerow  页的显示行数
    pageindex 要显示的页(从1开始)
    select top (pagerow) * from ABC where id not in (select top ((pageindex-1)*pagerow) id from ABC)把要显示的页 前面的记录过滤掉不过一开始总要搞下select count(*) 不然怎么知道有几页
      

  10.   

    用HIBERNATE做分页会或略检索策略的,我写过一篇文章专门讨论使用分页模板将遭遇SSH三大框架的功能漏洞,一会发上来
      

  11.   

    這個應該避不了,再說查二次,一次是count,一次是查某一段的內容。不影響速度吧。
      

  12.   

    用hibernate就很好了,能慢到哪去
    可以把count(1)出来的总数一直传递下去,如果你觉得有必要的话
    期待 13楼
      

  13.   

    to KK3K2005: top应该是SQL Server的语法,SQL Server对分页支持的不是很好,页数越靠后效率越差,不过其他数据库也是这种规律。to liu_yinpeng: 已拜读,有深度。to sunyujia: count的总数如果要存储,应当只适用于数据基本不变的情形。count(1)回头再详细测一下,目前简单试了一下oracle和mysql,似乎没有区别。
      

  14.   

    liu_yinpeng 还没发上来你怎么拜读的我也想看看,呵呵一些情况下恰恰要求点击查询的时候无论翻多少页看到的内容都是查询那一个时点的数据不知道楼上有没用考虑我知道楼主在写一个通用的东西,希望考虑到这个地方
      

  15.   

    鼠标放在“liu_yinpeng”名称上,“最新帖子”下有~
    这种情形比较特殊,似乎只能个别单独处理了,多谢提醒!
      

  16.   

    我觉得要看数据量。如果只有 10000 条以下数据,那就无所谓哪种方法。如果超过 100 万条数据,必须分两次 SQL 获取。
      

  17.   

    说错了。
    数据量多的话,建议用分页的 SQL 只获取当前页数据。
    至于 select count(*), 我认为倒是不一定要用。
    从使用 google 的情况看,google 搜索的时候,从页面上也看不出共有几页。它只是翻页到最后一页,发现没有数据了,然后才能看出来,一共有几页。
    如果你的用户,不需要每次都从页面上看出,共有几页,那么也可以不去执行 select count.
      

  18.   

    千万不要用*,那样非常影响效率,一般select count(id)查处总行数
    然后用确定下要查询的页数(number)和第几页(page),
    select top page id,name
    from 表
    where 条件 and id not in ( select top(number*(page-1))id from 表 where 条件)
    我一般就是这么写的,你可以参考下
      

  19.   

    那就要直接在查询数据的时候同时差出count了,其实count很快的。