資料讀取後,排序 是呈現邏輯的關鍵:最新文章優先、價格由低到高、依照姓名筆畫序……MySQL 的 ORDER BY 子句提供靈活、強大的排序能力,支援單欄位、多欄位、升序/降序混合指定。
SELECT field1, field2, ... FROM table_name [WHERE condition] ORDER BY field1 [ASC|DESC], field2 [ASC|DESC], ...;
WHERE、LIKE 等條件子句。mysql> SELECT * FROM runoob_tbl ORDER BY runoob_author ASC; +-----------+---------------+---------------+-----------------+ | runoob_id | runoob_title | runoob_author | submission_date | +-----------+---------------+---------------+-----------------+ | 2 | Learn MySQL | Abdul S | 2007-05-24 | | 1 | Learn PHP | John Poul | 2007-05-24 | | 3 | JAVA Tutorial | Sanjay | 2007-05-06 | +-----------+---------------+---------------+-----------------+
mysql> SELECT * FROM runoob_tbl ORDER BY runoob_author DESC; +-----------+---------------+---------------+-----------------+ | runoob_id | runoob_title | runoob_author | submission_date | +-----------+---------------+---------------+-----------------+ | 3 | JAVA Tutorial | Sanjay | 2007-05-06 | | 1 | Learn PHP | John Poul | 2007-05-24 | | 2 | Learn MySQL | Abdul S | 2007-05-24 | +-----------+---------------+---------------+-----------------+
需求:先按 submission_date 降序(最新優先),日期相同再按 runoob_author 升序。
mysql> SELECT * FROM runoob_tbl
-> ORDER BY submission_date DESC, runoob_author ASC;
<?php
$order = $_GET['order'] ?? 'DESC'; // ASC 或 DESC
$allowed = ['ASC', 'DESC'];
$order = in_array(strtoupper($order), $allowed) ? strtoupper($order) : 'DESC';
$sql = "SELECT runoob_id, runoob_title, runoob_author, submission_date
FROM runoob_tbl
ORDER BY runoob_author $order";
$retval = mysqli_query($conn, $sql);
while ($row = mysqli_fetch_assoc($retval)) {
echo "ID: {$row['runoob_id']} <br>";
echo "Title: {$row['runoob_title']} <br>";
echo "Author: {$row['runoob_author']} <br>";
echo "Date: {$row['submission_date']} <br><hr>";
}
?>
INDEX (runoob_author) 可避免 filesort,大幅提升 ORDER BY runoob_author 效能。ORDER BY a, b 需 INDEX (a, b),順序一致才能用上索引。ORDER BY a ASC, b DESC 若索引為 (a ASC, b ASC) 可能導致 filesort(MySQL 8.0+ 支援降序索引可解決)。ORDER BY id DESC LIMIT 10 取最新 10 筆,配合主鍵索引極快。utf8mb4_general_ci 不區分大小寫,utf8mb4_bin 區分大小寫且按二進制碼點排序。ASC 時 NULL 在最前,DESC 時 NULL 在最後(可用 ORDER BY col IS NULL, col 自訂)。靈活運用 ORDER BY,配合合適索引,即能高效實現各類排序需求,讓資料呈現更符合業務邏輯。