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

编程题:分页查询

Luz3年前 (2022-03-29)题库644
听说有位学长在做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
10 1 15
10 2 15
10 -2147483648 15
10 2147483647 15
-2147483648 0 15
2147483647 2147483647 15


#### 样例输出

out
10 4 4 30
10 2 1 0
10 2 2 10
10 2 1 0
10 2 2 10
10 2 1 0
20 1 1 0


#### 样例解释

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






答案:若无答案欢迎评论

发表评论

访客

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