-->
当前位置:首页 > 题库 > 正文内容

编程题:分页查询

Luz4年前 (2022-03-17)题库717
听说有位学长在做Web课设时把上千条查询结果全发到前端再分页显示,并声称这样能减少HTTP请求次数。
我可不会这么做,我要实现分页查询的逻辑。就是说,前端请求页面时除了查询条件,还会提供两个参数:

- page_size:每页最多显示的记录数。
- page_num:页码。

比方说每页最多显示10条查询结果。如果查到15条符合条件的结果,那么要分成2页。用户想看第1页时,我的后端程序要返回0-9条结果,想看第2页时要跳过前10条而返回10-14条结果。(用户从1开始数页码。而俺们开发人员从0开始数查询结果)

我用的PostgreSQL数据库查询时能指定结果集的偏移量offset和限量limit,比如SQL查询语句select * from student offset 10 limit 5;意思是略过前10条、最多返回5条记录。

- limit显然与前端传来的page_size相关。
- offset则要根据page_size和page_num算出来。

虽然我在前端加了数据校验,但**永远不要低估用户的能耐**!脑洞大开的用户或黑客总可以绕过检查发来恶意满满的数据。比如请求-100页或每页显示100000000行等。分页逻辑要足够健壮:检查请求参数并**必要时校正到合理的范围**。

#### 输入规格

- 首行有两个int32**正数**M和X,以空格分隔,分别表示分页逻辑允许的每页最少、最多记录数。
- 之后有若干次查询操作,请读入并处理直到EOF为止。每次查询有3个int32**整数**,分别表示:
- page_size:请求的每页记录数(来自客户端,**可能有异常值**)
- page_num:请求的页码(来自客户端,**可能有异常值**)
- record_count:符合查询条件的记录总数(可靠,非负)
- page_num是否有效要看查询结果的总页数page_count。而总页数又取决于page_size和record_count。

#### 输出规格

- 对每次查询操作,计算并输出4个整数(之间用1个空格分隔)然后换行:
- 每页记录数([M, X]范围内)
- 总页数(可能为0)
- 实际页码(最小为1)
- 偏移量(该页之前要略过的记录数)

#### 样例输入

in
10 20
5 6 37


#### 样例输出

out
10 4 4 30


#### 样例解释

- 首行表明分页逻辑允许的每页记录数最少为10、最多为20。
- 之后有1次查询操作:
- 希望每页5条、请求第6页、实际查到37条记录。
- **每页记录数**太少,校正为10,则37条记录对应**总页数**为4。
- 希望显示第6页,但这又太多了,**实际页码**修正为4。
- 显示第4页需要略过前30条记录,所需**偏移量**为30。
- 请根据int32范围进行充分测试,考虑很大、很小、中间结果溢出的可能。





答案:若无答案欢迎评论

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。