Mysql中通过Limit分页、获取页码、索引不一致问题

Mysql对Limit使用问题

这是mysql中limit分页的语法

SELECT 字段列表 FROM 表名 LIMIT 起始索引 , 查询条目数;


每页显示3条数据,查询第一页

select * from limit 3,3;

每页显示3条数据,查询第1页数据

select * from stu limit 0 , 3;

每页显示3条数据,查询第2页数据

select * from stu limit 3 , 3;

每页显示3条数据,查询第3页数据

select * from stu limit 6 , 3;

从上面的练习推导出起始索引计算公式:

起始索引 = (当前页码 - 1) * 每页显示的条数


现在,我要查询第5页
select * from tbl_emp limit 15,3;

按照上面的公式计算:
我在查询第6页

select * from tbl_emp limit  18,3;

# limit 语法: SELECT 字段列表 FROM 表名 LIMIT  起始索引,查询条目数;
# limit 起始索引(18) * 查询条目数(3) 索引0开始 就展示第19条
# 展示的数据: 19,20,21
# 页面数据: 18(索引)/3 = 6(页码); 
# 起始索引(公式) = (页码[6] - 1) * 每页显示条数(3) = 15;

我发现了,这不对数据不是一致性,这页码没有算出来起始索引.

我发现我可能理解错误了

接着回到那条sql

select * from stu limit 18,3; 

# limit 语法: SELECT 字段列表 FROM 表名 LIMIT  起始索引,查询条目数;
# limit 起始索引(18) * 查询条目数(3) 索引0开始 就展示第19条
# 展示的数据: 19,20,21
# 页面数据:
    应该从展示的数据的最后一位(21)去获取值,我们接着看
        页面数据:查询最后一位->21(条) / 3(显示) = 7(页码);
# 接着来算起始索引(公式):
    # 起始索引 = (页码 - 1) * 每页显示条数;
    (页码)(7 - 1) = 6;
    6 * 3(每页显示条数) = 18(起始索引);
# 发现没有 起始索引算出来了

疑问

大家可能会有小问题,说我分页后的数据没有是19,20,没有21了,21给我删掉了,那怎么办,mysql会怎么帮我们解决呢?答:向上取整数,不管你有没有21,有没有20,只要前面数据正常,有18,你在插入一条数据19,哎,他就会帮我们默认多显示一页数据,就是查询条目数。

最后:
本来我是向来请教大家这个问题的,可能是我方式不对,就分页很不懂,我就去看,很多老师告诉了我们计算 起始索引计算方式,缺少了页码获取,我就一头雾水,这个页码怎么能去拿索引获取的,不对啊,原来是我方式错误了,方法对确实能解决很多问题啊,最后页码获取为

分页后的数据最后一条 / 显示的数据 = 页码
分页后起始索引获取: 起始索引= (页码-1) * 页码
页码-1是因为索引从0开始的,不懂的兄弟可以回去复习复习(数组).

最后,谢谢您的观看!!!! 欢迎指错

阅读 2.5k
3 个回答

image.png
0.0 问答版本你就直接发疑问吧

大家可能会有小问题,说我分页后的数据没有是19,20,没有21了,21给我删掉了,那怎么办,mysql会怎么帮我们解决呢?答:向上取整数,不管你有没有21,有没有20,只要前面数据正常,有18,你在插入一条数据19,哎,他就会帮我们默认多显示一页数据,就是查询条目数。

额,你这理解都不知道偏到哪儿去了。

offset + limit 这种分页方式,跟 ID 啥的都没啥关系,简单地说,他其实就是类似于数组的 slice 方法,传入一个起始位置(offset) 和要截取的数量(limit)。也就是说,他是实际会把前面的数据都拿出来,然后丢弃,这也就是为什么大页码分页不推荐使用 offset + limit 的原因。

真的佩服你打这么多字,然后也没有总结出啥来,帮你整理一下吧。

问题:每页显示x行,查看第y页,写出逻辑及SQL格式示例。
回答:从 x * y - y 开始显示最多 y行。select * from t limit x * y - y, y

虽然 x y - y = (x - 1) y,但是这样化简后的逻辑不好解读。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题