我还是减肥吧

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

分页算法

Ps:表以users表说明,字段有userid,username,passwd。
定义四个变量,各有各的用处
int pageSize:每页显示多少条记录
int pageNow:希望显示第几页
int pageCount:一共有多少页
int rowCount:一共有多少条
说明:pageSize是指定的
        pageNow 是是用户选择的
        rowCount是从表中查询得到的,可以用select count(*) from users;得到所有记录的数目。
pageCount是计算出来的
该计算式为:

if(rowCount%pageSize==0){
 pageCount=rowCount/pageSize;
}else{
 pageCount=rowCount/pageSize+1;
}

当总的条数是每页显示条数的整数倍时,那么页数就是两者相除。
当不是时,就是两者相除加一。

例如:现在有9条记录,每页3条,则有三页。

   如果每页2条,则9%2得1,不为0,那根据计算,页数pageCount=9/2+1=5页,最后一页只有一条。

   每页4条呢,也是这么算的。

 

 那么如何得到每一页显示的东西呢,如何判断:

--------------------------------------------------------------------------------------------------

针对前面,很容易想到我们可以用如下sql语句得到某一页的内容
select 字段名列表 from 表名 where id between ? and ?;
显示第三页就是select * from users where userid between 7 and 9;
可行,但是有一个问题就是如果删除了一个id,某一页可能会少一条记录。就像删除8号一样。

--------------------------------------------------------------------------------------------------

解决方案,如下语句(sql server)
select top pageSize 字段名列表 from 表名 where id not in(select 
 top pageSize*(pageNow-1) id from 表名);(pagesize,pagenow均为之前声明的含义)


以之前的users表为例,显示第三页,查询语句就是
select top 3 * from users where userid not in(select top 6 userid from users)
意思是要查找第三页的话,先排除前两页的内容,将前两页的id去除
这样,按照顺序就可以将所有的内容显示,不用在意出现之前的问题了

 

mysql的话就是(我本人用的是mysql)
select * from users limit pagesize*(pagenow-1),pagesize;(pagesize,pagenow均为之前声明的含义)

 

当然还有一个效率测试,当表的内容很多很多,几万条?十几万?几十万?

可以使用如下语句:insert into users (username,passwd) select username,passwd from users;

这样可以复制原表内容并添加,执行几次就可以让自己的表指数增加。当然,主键是不可以相同的,userid作为主键设为自增呗。

 

 

posted on 2014-02-08 22:19  adaonline  阅读(288)  评论(0编辑  收藏  举报