5
回答
关于分页的一个设计方式
华为云4核8G,高性能云服务器,免费试用   
 最近在做分页,本身没什么太大问题,但是设计实现方式上,和其他人有点小出入,来看看大家是怎么认为的。

SQL:
SELECT COUNT(*) AS COUNT FROM TABLE_NAME -- 用于查找总数据量
SELECT * FROM TABLE_NAME WHERE ROWID BETWEEN ${from} AND ${to} -- 查找需要显示的数据
假设数据库原本有 10000 条数据,每页显示 50 条。页面上提供 首页、上一页、当前页、下一页、尾页五个标签可以点击换页,以及一个总件数标签显示数据库中的最新数据量。
当某次请求第 30 页的时候(请求范围:1501~1800),数据被删除,数据库中只剩下900 条数据,1501~1800区间已经没有数据。

我的意见是直接报数据找不到,然后前台的五个链接只能点击首页和尾页用于换页,其他的标签都不可点。

而其他有有些人的意见是当数据找不到的时候,向前检索,直到找到数据为止。上面的例子中,第30页的数据已经被删除,剩下的数据中,最先被找到的数据在第18 页(871~900区间),于是就将第 18 页的内容显示出来。

伪代码如下:
int page = request.get("page");
int count = dbQuery("SELECT COUNT(*) AS COUNT FROM TABLE_NAME").get("COUNT");
    
int dbPage = count / 50;
 
if (dbPage < page ) {
    page = dbPage;
    if (count % 50 == 0){
        page -= 1;
    }
}
 
setAttr("from",50 * page);
setAttr("to", 50 * (page +1 ));
List result = dbQuery("SELECT * FROM TABLE_NAME WHERE ROWID BETWEEN ${from} AND ${to}"
);

但我觉得有点像不明白,为什么在数据找不到的时候,还要向前检索,直到找到数据为止。这时候的数据已经不是我想要查找的数据了,这样的查找还有意义么?

不知道大家怎么理解这个问题。
<无标签>
举报
Undeadway
发帖于4年前 5回/353阅
共有5个答案 最后回答: 4年前


1.首先明确,分页是给人看的,计算机的处理不需要分页。所以分页的精确不精确没有意义。

2.向前搜索是对的,分页本质是人机交互形式的问题,因为人们真正期望的是看到后面的数据。其实没有人会随便点一个35页,423页啥的,去看里面的数据的。

3.直接报找不到也是对的,本来用户直接去点一个423页的目的,是因为不停的往后翻页,找到要看的东西后,准备点进去看,但是不小心点错了,比如关闭了网页,这个时候,用户需要直接点到423页,然后继续刚才的操作。如果你给他放了个18页的内容,用户肯定会迷惑,不知道下一步该怎么办了。如果你告诉用户说刚才你看的那一页数据已经被删除了,用户就知道怎么回事了。

LZ可以参考你们业务系统的场景,假象用户使用这个系统的想法和动机,结合具体业务情况,设计你的分页方式,让系统的用户使用更流畅。

而且貌似LZ自己的分页方式,比其他人的分页方式实现上要麻烦很多,估计其他人是懒得搞这么复杂吧?如果LZ的系统不是给互联网用户使用的公众系统,UI方面,意思意思就行了,没必要搞这么复杂。

你的分页方式会让用户很不爽,想想在搜索结果页面中连翻几页都是该页已删除,岂不立马崩溃,一般人就不会继续往下看了,而且会出现有时一页50行,有时又只有一两行(该页有删除行的情况),楼主的做法太偷懒了,还想狡辩

引用来自“好美小高”的评论

你的分页方式会让用户很不爽,想想在搜索结果页面中连翻几页都是该页已删除,岂不立马崩溃,一般人就不会继续往下看了,而且会出现有时一页50行,有时又只有一两行(该页有删除行的情况),楼主的做法太偷懒了,还想狡辩
我最开始说过了,被删除之后,只提供最前页也最后页两个连接可以使用。也就是说,先告诉用户这时候目标数据不存在了,但数据还是有的。但因为不清楚用户希望查找的数据是否在这个范围内,所以 给出首页和最后页标签来换页用。
而且显示行数不到50的时候,只会出现在最后一页。
顶部