全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

如何实现基于最后 ID 的双向分页(上一页/下一页)

本文介绍一种不依赖连续 id 的 mysql 双向分页方案:通过记录边界 id 并结合 `array_reverse()` 实现稳定、高效、容错的上一页/下一页导航,完美解决因数据删除导致 id 不连续带来的翻页错乱问题。

在基于 ID 的分页实践中,常见的“游标分页”(Cursor-based Pagination)通常采用 WHERE id 上一页却容易陷入误区:若简单使用 WHERE id 当前页起始 ID 为下界进行反向查询。

✅ 正确思路是:

  • 下一页:WHERE id
  • 上一页:WHERE id > $first_id LIMIT 21 → 获取更大 ID 的数据(自然升序),再反转数组,使其视觉顺序与用户预期一致(即顶部显示 ID=99,底部显示 ID=120)。

以下是完整 PHP + MySQL 实现示例(含关键注释):

prepare("SELECT * FROM table_name WHERE id > ? LIMIT ?");
    $stmt->execute([$_GET['prev'], $limit]);
    $results = array_reverse($stmt->fetchAll(PDO::FETCH_ASSOC));
} elseif ($isNext) {
    // 下一页:查比 $last_id 更小的 21 条(降序)
    $stmt = $db->prepare("SELECT * FROM table_name WHERE id < ? ORDER BY id DESC LIMIT ?");
    $stmt->execute([$_GET['next'], $limit]);
    $results = $stmt->fetchAll(PDO::FETCH_ASSOC);
} else {
    // 首页:取最大的 21 条
    $stmt = $db->prepare("SELECT * FROM table_name ORDER BY id DESC LIMIT ?");
    $stmt->execute([$limit]);
    $results = $stmt->fetchAll(PDO::FETCH_ASSOC);
}

// 渲染数据(假设按 id 降序展示)
foreach ($results as $row) {
    echo "ID: {$row['id']} | {$row['title']}";
}

// 生成分页按钮(关键:传递正确的边界 ID)
$firstId = !empty($results) ? $results[0]['id'] : null;
$lastId  = !empty($results) ? end($results)['id'] : null;

// 上一页按钮:传当前页第一条记录的 ID(即上一页的「最小 ID」应 > 它)
if ($firstId !== null) {
    echo '← 上一页';
}

// 下一页按钮:传当前页最后一条记录的 ID(即下一页的「最大 ID」应 < 它)
if ($lastId !== null && count($results) === $limit) {
    echo '下一页 →';
}
?>

⚠️ 重要注意事项

  • 必须确保 id 字段有索引(如主键或唯一索引),否则 WHERE id > ? 查询将全表扫描,性能急剧下降;
  • 避免混合使用 OFFSET:传统 LIMIT offset, size 在大数据量下效率低下,且无法精准支持“上一页”逻辑;
  • 边界 ID 必须来自当前页真实数据:切勿用计算(如 $firstId - 21),因 ID 不连续;
  • 前端需禁用重复提交:防止用户快速点击导致状态错乱;
  • 考虑添加 created_at 辅助排序:若存在同 ID 冲突(极罕见),可加二级排序保障稳定性,如 ORDER BY id DESC, created_at DESC。

该方案彻底摆脱对 ID 连续性的依赖,即使中间大量删除数据,翻页依然精准、响应迅速,是高并发、大数据量场景下的推荐实践。


# mysql  # php  # 前端  # 大数据  # 并发  # 上一页  # 下一页  # 分页  # 升序  # 当前页  # 更大  # 降序  # 翻页  # 不连续  # 使其 


相关文章: 如何有效防御Web建站篡改攻击?  宝塔面板如何快速创建新站点?  西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?  如何在腾讯云服务器上快速搭建个人网站?  如何用PHP快速搭建CMS系统?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?  如何快速登录WAP自助建站平台?  如何在局域网内绑定自建网站域名?  如何选择服务器才能高效搭建专属网站?  临沂网站制作企业,临沂第三中学官方网站?  Java解压缩zip - 解压缩多个文件或文件夹实例  ,怎么用自己头像做动态表情包?  枣阳网站制作,阳新火车站打的到仙岛湖多少钱?  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  如何快速搭建高效WAP手机网站?  如何规划企业建站流程的关键步骤?  油猴 教程,油猴搜脚本为什么会网页无法显示?  微信小程序 input输入框控件详解及实例(多种示例)  Swift中swift中的switch 语句  电脑免费海报制作网站推荐,招聘海报哪个网站多?  制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?  建站主机是否等同于虚拟主机?  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  建站主机系统SEO优化与智能配置核心关键词操作指南  如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法  香港服务器建站指南:免备案优势与SEO优化技巧全解析  制作电商网页,电商供应链怎么做?  如何在阿里云虚拟主机上快速搭建个人网站?  如何在万网自助建站平台快速创建网站?  制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?  如何用PHP工具快速搭建高效网站?  C++如何将C风格字符串(char*)转换为std::string?(代码示例)  百度网页制作网站有哪些,谁能告诉我百度网站是怎么联系?  娃派WAP自助建站:免费模板+移动优化,快速打造专业网站  英语简历制作免费网站推荐,如何将简历翻译成英文?  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  如何用y主机助手快速搭建网站?  相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?  建站之星伪静态规则如何设置?  ,sp开头的版面叫什么?  如何用好域名打造高点击率的自主建站?  seo网站制作优化,网站SEO优化步骤有哪些?  唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?  官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站  如何高效生成建站之星成品网站源码?  建站主机服务器选购指南:轻量应用与VPS配置解析  如何基于云服务器快速搭建网站及云盘系统?  如何快速搭建响应式可视化网站?  Python多线程使用规范_线程安全解析【教程】 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。