ลำดับการประมวลผล: ORDER BY ก่อน LIMIT
ใน MySQL (และ SQL มาตรฐาน) ORDER BY จะถูกประมวลผลก่อน LIMIT เสมอ
ลำดับการทำงานของ SELECT:
- FROM / JOIN
- WHERE
- GROUP BY
- HAVING
- SELECT (select list)
- ORDER BY
- LIMIT
ตัวอย่างยืนยัน
mysql> CREATE TABLE LimitAfterOrderBy (
-> Id INT,
-> Name VARCHAR(100)
-> );
Query OK, 0 rows affected (0.50 sec)
mysql> INSERT INTO LimitAfterOrderBy VALUES(101,'John');
mysql> INSERT INTO LimitAfterOrderBy VALUES(102,'Carol');
mysql> INSERT INTO LimitAfterOrderBy VALUES(103,'Bob');
mysql> INSERT INTO LimitAfterOrderBy VALUES(104,'Sam');
ข้อมูลเริ่มต้น (เรียงตาม Id)
mysql> SELECT * FROM LimitAfterOrderBy;
+------+-------+ | Id | Name | +------+-------+ | 101 | John | | 102 | Carol | | 103 | Bob | | 104 | Sam | +------+-------+ 4 rows in set (0.00 sec)
ORDER BY Name แล้ว LIMIT 4
mysql> SELECT * FROM LimitAfterOrderBy ORDER BY Name LIMIT 4;
+------+-------+ | Id | Name | +------+-------+ | 103 | Bob | | 102 | Carol | | 101 | John | | 104 | Sam | +------+-------+ 4 rows in set (0.00 sec)
ผลลัพธ์: ข้อมูลถูกเรียงตาม Name (Bob, Carol, John, Sam) ก่อน แล้วค่อย LIMIT 4
สำคัญสำหรับ Pagination:
-- หน้าที่ 1 (แถว 1-10) SELECT * FROM table ORDER BY created_at DESC LIMIT 10 OFFSET 0; -- หน้าที่ 2 (แถว 11-20) SELECT * FROM table ORDER BY created_at DESC LIMIT 10 OFFSET 10;
ต้อง ORDER BY ก่อน จึงจะได้หน้าที่ถูกต้องและสอดคล้องกัน