MyBatis 映射文件中分頁查詢:
SELECTFROM USER U WHERE U.status != #{status} AND (U.NAME LIKE #{keyword} OR U.USERNAME LIKE #{keyword}) ORDER BY U.lastupdateddate DESC LIMIT #{offsetNum}, #{pageSize}
SELECT ...
FROM USER U
WHERE ...
LIMIT #{offsetNum}, #{pageSize}
ORDER BY U.lastupdateddate DESC
-- 報錯:SQL syntax error
FROM / JOINWHEREGROUP BYHAVINGSELECTDISTINCTORDER BYLIMIT / OFFSET結論:ORDER BY 在 LIMIT 之前執行,這是 SQL 標準語法規定。MySQL 解析器要求 ORDER BY 子句必須出現在 LIMIT 之前。
| 寫法 | 邏輯含義 | 結果 |
|---|---|---|
ORDER BY ... LIMIT m,n | 對全結果集排序後,取第 m 條起 n 條 | 正確分頁 |
LIMIT m,n ORDER BY ... | 語法錯誤(MySQL 不支援) | 報錯 |
-- 深分頁:OFFSET 1000000 LIMIT 10 -- 必須掃描前 1,000,010 行,極慢
-- 首頁 SELECT * FROM t WHERE status=1 ORDER BY id DESC LIMIT 20; -- 翻頁:記住上一頁最小 id SELECT * FROM t WHERE status=1 AND id < 1000 ORDER BY id DESC LIMIT 20;
-- 支援 OFFSET ... ROWS FETCH NEXT ... ROWS ONLY SELECT * FROM t ORDER BY id DESC OFFSET 100 ROWS FETCH NEXT 20 ROWS ONLY;
ORDER BY 必須在 LIMIT 之前WHERE id > last_id 游標模式