想從表 `a` 倒序輸出 `id` 從 20 到 11 的記錄 (即第 2 大到第 11 大),寫成 `SELECT * FROM a WHERE id LIMIT 10,20 ORDER BY id DESC` 會報錯。原因是 MySQL 語法規定 `ORDER BY` 必須寫在 `LIMIT` 之前。
SELECT * FROM a ORDER BY id DESC LIMIT 10, 10;
注意:`LIMIT offset, row_count` 中 offset 從 0 開始。若要「id 從 20 到 11」,假設 id 連續且無縺隙,上述語句即可;若 id 不連續,應改用 `WHERE id BETWEEN 11 AND 20 ORDER BY id DESC`。
若必須先篩選再排序 (如先 `WHERE` 後 `ORDER BY` 再 `LIMIT`),可用子查詢:
SELECT t.* FROM (SELECT * FROM a WHERE id > 100) t ORDER BY t.id DESC LIMIT 10;
但標準單表查詢**無需子查詢**,直接 `WHERE → ORDER BY → LIMIT` 順序即可。
| 錯誤寫法 | 問題 | 正確寫法 |
|---|---|---|
| `SELECT * FROM a LIMIT 10,20 ORDER BY id DESC` | 語法錯誤:LIMIT 必須在最後 | `SELECT * FROM a ORDER BY id DESC LIMIT 10,20` |
| `SELECT * FROM a WHERE id LIMIT 10,20` | `WHERE id` 缺少條件運算符 | `SELECT * FROM a WHERE id > 0 ORDER BY id DESC LIMIT 10,20` |
| `SELECT * FROM a ORDER BY id LIMIT 10 OFFSET 20` | MySQL 支援 `LIMIT ... OFFSET ...` 但順序固定 | `SELECT * FROM a ORDER BY id LIMIT 20 OFFSET 10` (同 LIMIT 10,20) |
當 `offset` 很大 (如 `LIMIT 1000000, 20`) 時,`ORDER BY ... LIMIT` 效能會急劇下降。優化策略:
掌握標準語法順序 `SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY → LIMIT`,分頁排序不再出錯。