PHP 入门教程
MySQL ORDER BY 与 LIMIT
本教程共 65 篇 · 第 53 篇 · 更新于 2026-07-24 · 约 7 分钟阅读
PHPPHP8MySQLORDER BYLIMIT分页排序OFFSET
53. MySQL ORDER BY 与 LIMIT
本节目标:掌握排序和分页语法,能够对查询结果排序并实现数据分页展示。
查询结果默认按主键顺序返回。实际场景中,通常需要按时间、价格等字段排序,并分页显示。
1. ORDER BY 排序
-- 按年龄升序排列(ASC 可省略)
SELECT * FROM users ORDER BY age ASC;
-- 按年龄降序排列
SELECT * FROM users ORDER BY age DESC;
-- 按注册时间从新到旧
SELECT * FROM users ORDER BY created_at DESC;
Note
ASC= Ascending(升序),DESC= Descending(降序)。默认是ASC。
2. 多字段排序
先按第一个字段排序,相同值再按第二个字段排序:
-- 先按状态升序,再按创建时间降序
SELECT * FROM orders ORDER BY status ASC, created_at DESC;
3. LIMIT 限制结果数量
-- 只返回前 5 条
SELECT * FROM users LIMIT 5;
-- 跳过前 10 条,再取 5 条(第11-15条)
SELECT * FROM users LIMIT 10, 5;
-- 同上,另一种写法(MySQL 8.0+)
SELECT * FROM users LIMIT 5 OFFSET 10;
Tip
LIMIT 偏移量, 数量中,偏移量从 0 开始。第一页就是LIMIT 0, 每页条数。
4. 分页公式
分页是 Web 开发必备技能。
<?php
$page = $_GET['page'] ?? 1; // 当前页码
$page = max(1, (int)$page); // 至少为1
$perPage = 10; // 每页条数
$offset = ($page - 1) * $perPage; // 偏移量
$stmt = $pdo->prepare("SELECT * FROM users ORDER BY id DESC LIMIT :limit OFFSET :offset");
$stmt->bindValue(':limit', $perPage, PDO::PARAM_INT);
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
$stmt->execute();
$users = $stmt->fetchAll(PDO::FETCH_ASSOC);
Note
LIMIT后的参数必须用bindValue并指定PDO::PARAM_INT,否则会被当作字符串处理,导致语法错误。
5. 获取总页数
<?php
$total = $pdo->query("SELECT COUNT(*) FROM users")->fetchColumn();
$totalPages = (int) ceil($total / $perPage);
echo "共 {$total} 条记录,{$totalPages} 页";
6. 排序+分页完整示例
<?php
$pdo = new PDO('mysql:host=localhost;dbname=my_shop;charset=utf8mb4', 'root', '123456');
$page = max(1, (int)($_GET['page'] ?? 1));
$perPage = 10;
$offset = ($page - 1) * $perPage;
// 查询数据
$stmt = $pdo->prepare(
"SELECT id, username, created_at
FROM users
ORDER BY created_at DESC
LIMIT :limit OFFSET :offset"
);
$stmt->bindValue(':limit', $perPage, PDO::PARAM_INT);
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
$stmt->execute();
$users = $stmt->fetchAll(PDO::FETCH_ASSOC);
// 查询总数
$total = (int) $pdo->query("SELECT COUNT(*) FROM users")->fetchColumn();
$totalPages = (int) ceil($total / $perPage);
// 输出
foreach ($users as $user) {
echo "{$user['username']} - {$user['created_at']}<br>";
}
echo "第 {$page} / {$totalPages} 页";
小结
ORDER BY 控制展示顺序,LIMIT 控制展示数量。两者配合实现分页,是列表页面的标准做法。
来源:参考了 runoob「PHP MySQL Order By」、PHP 官方文档,改写后所得。