Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

วิธีดึง 10 แถวแรก ตามด้วยแถวที่เหลือในคำสั่ง MySQL เดียว

การดึงข้อมูลแบบทุกรายการด้วย 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 (ดึงทั้งหมด) เพราะคำสั่งเดียวคืนชุดผลลัพธ์ชุดเดียว ไม่สามารถคืน "ชุดแรก แล้วตามด้วยชุดที่สอง" แยกกันได้