本文介绍如何通过两条简洁的 sql 查询语句,在非连续主键的 mysql 表中准确获取某条记录的前驱 id(prev_id)和后继 id(next_id),并提供可直接集成的 php 函数实现与关键注意事项。
在实际开发中,尤其是构建文章翻页、图库浏览或日志导航等功能时,我们常需根据当前记录的 id 快速定位逻辑上“上一篇”和“下一篇”的记录。由于数据库中的 id 往往因删除、跳号或业务规则而不连续(例如当前 ID 是 50,前一条可能是 22,后一条是 81),因此不能依赖 id-1 或 id+1 这类简单运算——必须基于真实数据排序逻辑进行查找。
核心思想非常清晰:
这两条查询天然适配无序/稀疏主键,并且在 id 字段上有索引时性能优异(推荐为 id 建立 B-tree 索引,如 PRIMARY KEY 或 INDEX(id))。
以下是一个使用 PDO 参数化查询的健壮实现,避免 SQL 注入,同时合并为单次查询提升效率:
public function prevNext($id): array
{
$sql = "SELECT
(SELECT MAX(id) FROM `table` WHERE id < ?) AS prev_id,
(SELECT MIN(id) FROM `table` WHERE id > ?) AS next_id";
$stmt = $this->pdo->prepare($sql);
$stmt->execute([$id, $id]);
return $stmt->fetch(PDO::FETCH_ASSOC) ?: ['prev_id' => null, 'next_id' => null];
}✅ 优势说明: 使用参数化绑定(?)彻底杜绝 SQL 注入风险; 单次查询完成两个子查询,减少网络与解析开销; ?: 提供空结果兜底,确保返回数组结构稳定。

掌握这一模式,你就能在任意 ID 分布场景下,稳定、高效地实现“上一篇/下一篇”导航逻辑。
来电咨询