การดึงข้อมูลแบบทุกรายการด้วย LIMIT และ OFFSET
คำถามนี้อาจสับสน: "10 แถวแรก ตามด้วยแถวที่เหลือ" ในคำสั่งเดียว → คำตอบคือ **ดึงทั้งหมดเลย** (LIMIT ใหญ่พอ หรือไม่ใส่ LIMIT)
ตัวอย่าง: ตารางมี 16 แถว ต้องการ 10 แถวแรก + ที่เหลือ
1. สร้างตารางและเพิ่มข้อมูล 16 แถว
CREATE TABLE DemoTable (Id INT);
INSERT INTO DemoTable VALUES (100),(101),(102),(103),(104),(105),(106),(107),(108),(109),(110),(111),(112),(113),(114),(115);
2. ดูข้อมูลทั้งหมด
SELECT * FROM DemoTable;
16 แถว: 100 ถึง 115
3. คำสั่งในบทความต้นฉบับ (ดึงทั้งหมด)
SELECT * FROM DemoTable LIMIT 999 OFFSET 0;
ผลลัพธ์: 16 แถวทั้งหมด (เพราะข้อมูลมีแค่ 16 แถว)
การตีความที่ถูกต้อง
- หากต้องการ "10 แถวแรก แล้วตามด้วยที่เหลือ" ใน **คำสั่งเดียว** = **ดึงทั้งหมด** (ไม่ต้อง LIMIT/OFFSET)
- หากต้องการ **สองชุดผลลัพธ์แยกกัน** ต้องใช้ 2 คำสั่ง หรือ UNION ALL
วิธีที่ถูกต้องสำหรับ Pagination (แบ่งหน้า)
-- หน้าแรก: 10 แถวแรก
SELECT * FROM DemoTable ORDER BY Id LIMIT 10 OFFSET 0;
-- หน้าที่สอง: 10 แถวถัดไป
SELECT * FROM DemoTable ORDER BY Id LIMIT 10 OFFSET 10;
-- หน้าที่ N
SELECT * FROM DemoTable ORDER BY Id LIMIT 10 OFFSET (page-1)*10;
การรวม 2 ชุดผลลัพธ์ในคำสั่งเดียว (UNION ALL)
(SELECT * FROM DemoTable ORDER BY Id LIMIT 10 OFFSET 0)
UNION ALL
(SELECT * FROM DemoTable ORDER BY Id LIMIT 1000 OFFSET 10);
หมายเหตุ: ต้องใส่วงเล็บครอบแต่ละ SELECT
MySQL 8.0+ : ใช้ Window Function แทน
SELECT * FROM (
SELECT *, ROW_NUMBER() OVER (ORDER BY Id) AS rn
FROM DemoTable
) t
WHERE rn <= 10 OR rn > 10; -- ทุกแถว (ตัวอย่างแสดง Logic)
-- จริงๆ WHERE rn <= 10 สำหรับหน้าแรก, WHERE rn > 10 AND rn <= 20 สำหรับหน้าที่ 2
สรุป
คำถาม "10 แถวแรก ตามด้วยที่เหลือ ในคำสั่งเดียว" = SELECT * FROM table (ดึงทั้งหมด) เพราะคำสั่งเดียวคืนชุดผลลัพธ์ชุดเดียว ไม่สามารถคืน "ชุดแรก แล้วตามด้วยชุดที่สอง" แยกกันได้