1- oracle 数据库
2- 上百万条数据,商品编号做主键 数据库表中已经排序好了,但是,并不连续!!! 并不是连续的, 比如:1 2 3 5 7 8 11 13 20 26 我说的就是这意思。
3- Web程序, 在网页上用GridView 分页, 每页约20条记录现在的问题是,如果选择“下一页” 读取数据没有问题, 但是如果选择指定的页, 或者 向前,向后 条制定的页数 就在逻辑上出现问题了。
因为不是连续的,在读取下一页的时候可以知道当前页的最后一条纪录的编号,然后读取后面的20条记录没有问题, 但如果跳页。比如跳8页,那样的话,就不知道要从哪一条记录开始读取了。自己虽然知道 跳8页 就是跳160条记录,但由于 主键的编号是不连续的, 根本不知道要从哪个地方读取啊!
小弟初来csdn 没多少分 就全给了好了!
2- 上百万条数据,商品编号做主键 数据库表中已经排序好了,但是,并不连续!!! 并不是连续的, 比如:1 2 3 5 7 8 11 13 20 26 我说的就是这意思。
3- Web程序, 在网页上用GridView 分页, 每页约20条记录现在的问题是,如果选择“下一页” 读取数据没有问题, 但是如果选择指定的页, 或者 向前,向后 条制定的页数 就在逻辑上出现问题了。
因为不是连续的,在读取下一页的时候可以知道当前页的最后一条纪录的编号,然后读取后面的20条记录没有问题, 但如果跳页。比如跳8页,那样的话,就不知道要从哪一条记录开始读取了。自己虽然知道 跳8页 就是跳160条记录,但由于 主键的编号是不连续的, 根本不知道要从哪个地方读取啊!
小弟初来csdn 没多少分 就全给了好了!
取rownum来排序(先order by,再取rownum就不会乱了)
int offset = 0;
if (argNowPage > 0) {
offset = (argNowPage - 1) * argListSize;
} String newWhereStatement = "";
if (offset > 0) {
int iLimit = offset + limit;
int iOffset = offset + 1;
newWhereStatement = " WHERE line BETWEEN " + String.valueOf(iOffset) + " AND " + String.valueOf(iLimit); } else {
newWhereStatement = " WHERE line <= " + String.valueOf(limit);
} newStatement =
"SELECT * FROM (" +
"SELECT t1.*, rownum line FROM (" +
argStatement +
" ) t1 )" +
newWhereStatement; return newStatement;
}
在sql语句的末尾调用此函数,argStatement:你写的sql语句,argListSize:每页要显示的纪录条数,argNowPage:要显示页的页码号
比如, 把商品的产地作为查询条件,查询产自欧洲的产品 在页面上显示,这样怎么进行分页才能提高效率呢?
先根据你的商品产地ORDER BY 然后再取ROWNUM 如二楼所说.
select * from (
select * from (select t.*,rownum rn from table t where xxx order by XXX)
where rn<=...)--数字需要你计算
where rn>...--数字需要你计算