首页 / PHP 入门教程 / MySQL ORDER BY 与 LIMIT

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 官方文档,改写后所得。