ORDER BY + LIMIT
เรียงผลลัพธ์ ASC/DESC, ตัดเอาแค่ N อันแรก พร้อม OFFSET สำหรับ pagination
~5 นาที
จากบทที่แล้วเราคัด row ด้วย WHERE ได้แล้ว แต่ผลลัพธ์ที่ออกมา database ไม่รับประกันว่าจะเรียงลำดับมายังไง ถ้าอยากให้เรียงตามอะไร หรืออยากเอาแค่ N อันแรก ต้องสั่ง database ให้ตรงๆ
ORDER BY สำหรับเรียงผลลัพธ์
SELECT * FROM products
ORDER BY price DESC;ASCคือเรียงจากน้อยไปมาก ซึ่งเป็น default ถ้าไม่ระบุก็เป็นแบบนี้DESCคือเรียงจากมากไปน้อย- เรียงหลาย column พร้อมกันได้ เช่น
ORDER BY status, total DESCหมายถึง เรียงตาม status ก่อน แล้วภายใน status เดียวกันค่อยเรียง total จากมากไปน้อย
LIMIT สำหรับเอาแค่ N อันแรก
Vibe Mart มีลูกค้าเป็นแสน เราคงไม่อยากดูทุกคนพร้อมกัน LIMIT 10 บอกให้เอาแค่ 10 row แรก ซึ่งใช้บ่อยมาก ในการทำ pagination หรือทำหน้า "Top 10 รายการ"
SELECT * FROM orders
ORDER BY total DESC
LIMIT 10 OFFSET 20;OFFSET 20 หมายถึงข้าม 20 row แรกก่อน แล้วค่อยเอา 10 row ถัดไป (ก็คือ row ที่ 21 ถึง 30) ใช้คู่กับ LIMIT สำหรับการเลื่อนหน้า
ลองปรับดู ดู row จัดเรียงใหม่
เปลี่ยน column, direction, และ LIMIT ดูตาราง products ของ Vibe Mart จัดเรียงใหม่ row ที่ถูก LIMIT ตัดออกจะจางลงให้เห็นว่าหายไปจากผลลัพธ์
ORDER BY
direction
LIMIT (5)
SELECT id, name, price, stock, category_id FROM products ORDER BY price DESC LIMIT 5;
| id | name | price | stock | category |
|---|---|---|---|---|
| 11 | น้ำหอม | 1,290 | 20 | เครื่องสำอาง |
| 15 | หูฟัง bluetooth | 890 | 25 | อุปกรณ์มือถือ |
| 3 | เครื่องคิดเลข | 450 | 35 | เครื่องเขียน |
| 13 | การ์ดเกม Magic | 450 | 40 | เกม |
| 10 | ครีมกันแดด | 390 | 80 | เครื่องสำอาง |
| LIMIT ตัดที่นี่ (10 แถวด้านล่างไม่ถูกส่งกลับ) | ||||
| 9 | ลิปสติก | 290 | 45 | เครื่องสำอาง |
| 12 | เกมมือถือ premium | 199 | 999 | เกม |
| 14 | สายชาร์จ USB-C | 159 | 180 | อุปกรณ์มือถือ |
| 8 | มาส์กหน้า | 149 | 60 | เครื่องสำอาง |
| 2 | สมุดโน้ต A5 | 89 | 120 | เครื่องเขียน |
| 7 | ช็อคโกแลต | 89 | 95 | อาหารแห้ง |
| 5 | ขนมปังกรอบ | 45 | 150 | อาหารแห้ง |
| 1 | ปากกาเจล | 35 | 240 | เครื่องเขียน |
| 6 | น้ำผลไม้ | 35 | 200 | อาหารแห้ง |
| 4 | มาม่ารสต้มยำ | 8 | 800 | อาหารแห้ง |
LIMIT ตัดให้เหลือ 5 จาก 15 แถว5 rows
Playground ลองเรียงและตัดเอง
ตัวอย่าง:
กด Cmd / Ctrl + Enter เพื่อรัน
สรุปบทนี้
ORDER BY col [ASC|DESC]ใช้เรียงผลลัพธ์LIMIT nคู่กับOFFSET mใช้เอา n row หลังจากข้าม m row แรก- ถ้าไม่ใส่ ORDER BY ลำดับไม่มีการรับประกัน อย่าพึ่งพาเด็ดขาด
- บทถัดไปจะเข้าเรื่อง JOIN ต่อตาราง ซึ่งเป็นบทใหญ่ที่ relational database เริ่มแสดงพลัง