分页算法
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作为主键设为自增呗。