Clause LIMIT คืออะไร?
ในบทที่แล้ว เราได้เรียนรู้เกี่ยวกับการเรียงลำดับข้อมูลด้วย ORDER BY Clause ซึ่งช่วยให้เราสามารถจัดเรียงผลลัพธ์ตามความต้องการได้ แต่ในบางครั้ง เราอาจไม่ต้องการแสดงผลลัพธ์ทั้งหมดที่ได้จากการ Query โดยเฉพาะอย่างยิ่งเมื่อตารางมีข้อมูลจำนวนมาก การแสดงผลทั้งหมดอาจทำให้เสียเวลาและทรัพยากรโดยไม่จำเป็น ในบทนี้ เราจะมาเรียนรู้เกี่ยวกับการใช้ LIMIT Clause เพื่อจำกัดจำนวนแถวที่แสดงผล ทำให้เราสามารถจัดการกับข้อมูลจำนวนมากได้อย่างมีประสิทธิภาพมากขึ้น
LIMIT number
รูปแบบการใช้งานพื้นฐานของ LIMIT คือการกำหนดจำนวนแถวสูงสุดที่ต้องการแสดงผล ตัวอย่างเช่น หากเราต้องการแสดงข้อมูล 5 แถวแรกจากตาราง customers เราสามารถใช้คำสั่ง SQL ดังนี้:
SELECT * FROM customers LIMIT 5;
คำสั่งนี้จะเลือกข้อมูลทั้งหมดจากตาราง customers แต่จะแสดงผลเพียง 5 แถวแรกเท่านั้น โดย MySQL จะเลือกแถวตามลำดับที่ถูกเก็บไว้ในตาราง (ซึ่งอาจไม่ใช่ลำดับที่เราต้องการ หากต้องการลำดับที่แน่นอน ควรใช้ร่วมกับ ORDER BY Clause)
ตัวอย่างการใช้งานจริง: สมมติว่าเรามีเว็บไซต์อีคอมเมิร์ซ และต้องการแสดงสินค้าใหม่ล่าสุด 3 รายการบนหน้าแรก เราสามารถใช้ LIMIT ร่วมกับ ORDER BY เพื่อให้ได้ผลลัพธ์ที่ต้องการ:
SELECT * FROM products ORDER BY created_at DESC LIMIT 3;
คำสั่งนี้จะเรียงลำดับสินค้าตามวันที่สร้าง (created_at) จากใหม่ไปเก่า (DESC) และแสดงผลเพียง 3 รายการแรก ซึ่งก็คือสินค้าใหม่ล่าสุด 3 รายการนั่นเอง
LIMIT offset, number
นอกจากรูปแบบพื้นฐานแล้ว LIMIT ยังสามารถใช้ร่วมกับ offset เพื่อกำหนดจุดเริ่มต้นในการแสดงผลได้ รูปแบบการใช้งานคือ LIMIT offset, number โดยที่:
offsetคือจำนวนแถวที่ต้องการข้ามไปก่อนที่จะเริ่มแสดงผลnumberคือจำนวนแถวที่ต้องการแสดงผล
ตัวอย่างเช่น หากเราต้องการแสดงข้อมูลแถวที่ 6 ถึง 10 จากตาราง customers เราสามารถใช้คำสั่ง SQL ดังนี้:
SELECT * FROM customers LIMIT 5, 5;
คำสั่งนี้จะข้าม 5 แถวแรก (offset = 5) และแสดงผลอีก 5 แถว (number = 5) ซึ่งก็คือแถวที่ 6 ถึง 10 นั่นเอง (โปรดจำไว้ว่า offset เริ่มต้นที่ 0)
ข้อผิดพลาดที่พบบ่อย: ผู้เริ่มต้นมักจะสับสนระหว่าง offset และ number โปรดจำไว้ว่า offset คือจุดเริ่มต้น และ number คือจำนวนแถวที่ต้องการแสดงผล
ตัวอย่างการใช้งานจริง: สมมติว่าเรามีระบบ pagination ในเว็บไซต์ และผู้ใช้กำลังดูหน้าที่ 3 โดยแต่ละหน้าแสดงผล 10 รายการ เราสามารถใช้ LIMIT ร่วมกับ offset เพื่อดึงข้อมูลที่ถูกต้องมาแสดงผล:
SELECT * FROM products LIMIT 20, 10;
เนื่องจากแต่ละหน้าแสดงผล 10 รายการ และผู้ใช้กำลังดูหน้าที่ 3 ดังนั้นเราจึงต้องข้าม 20 รายการแรก (2 หน้า * 10 รายการต่อหน้า) และแสดงผลอีก 10 รายการ
Pagination
LIMIT Clause มีประโยชน์อย่างมากในการสร้างระบบ pagination ซึ่งเป็นวิธีการแบ่งข้อมูลจำนวนมากออกเป็นหน้าๆ เพื่อให้ผู้ใช้สามารถเรียกดูข้อมูลได้อย่างสะดวกและรวดเร็ว โดยไม่ต้องรอให้ข้อมูลทั้งหมดถูกโหลดพร้อมกัน
ขั้นตอนการสร้างระบบ Pagination แบบง่าย:
- คำนวณจำนวนหน้าทั้งหมด: ก่อนอื่นเราต้องรู้ว่าข้อมูลทั้งหมดมีกี่รายการ และแต่ละหน้าจะแสดงผลกี่รายการ จากนั้นเราสามารถคำนวณจำนวนหน้าทั้งหมดได้โดยใช้สูตร:
จำนวนหน้า = จำนวนข้อมูลทั้งหมด / จำนวนรายการต่อหน้า(ปัดเศษขึ้นหากมีเศษ) - ดึงข้อมูลสำหรับหน้าปัจจุบัน: เมื่อผู้ใช้เลือกหน้าใดหน้าหนึ่ง เราจะใช้
LIMITร่วมกับoffsetเพื่อดึงข้อมูลที่ถูกต้องมาแสดงผล โดยoffsetจะคำนวณจาก(หมายเลขหน้า - 1) * จำนวนรายการต่อหน้า - แสดงผลข้อมูลและปุ่มนำทาง: สุดท้ายเราจะแสดงผลข้อมูลที่ได้จากการ Query และสร้างปุ่มนำทาง (เช่น ปุ่ม "หน้าก่อนหน้า", ปุ่ม "หน้าถัดไป", และปุ่มสำหรับแต่ละหน้า) เพื่อให้ผู้ใช้สามารถไปยังหน้าต่างๆ ได้
ตัวอย่างการใช้งาน: สมมติว่าเรามีตาราง articles ที่มีข้อมูลบทความจำนวนมาก และเราต้องการสร้างระบบ pagination โดยให้แต่ละหน้าแสดงผล 5 บทความ
<?php
// กำหนดจำนวนรายการต่อหน้า
$itemsPerPage = 5;
// ดึงหมายเลขหน้าจาก query string (ถ้าไม่มีให้ใช้หน้า 1)
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
// คำนวณ offset
$offset = ($page - 1) * $itemsPerPage;
// เชื่อมต่อกับฐานข้อมูล MySQL (แทนที่ด้วยข้อมูลการเชื่อมต่อของคุณ)
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "database_name";
$conn = new mysqli($servername, $username, $password, $dbname);
// ตรวจสอบการเชื่อมต่อ
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// Query ข้อมูลบทความ
$sql = "SELECT * FROM articles LIMIT $offset, $itemsPerPage";
$result = $conn->query($sql);
// ตรวจสอบว่ามีข้อมูลหรือไม่
if ($result->num_rows > 0) {
// แสดงผลข้อมูลบทความ
while($row = $result->fetch_assoc()) {
echo "<h3>" . $row["title"] . "</h3>";
echo "<p>" . $row["content"] . "</p>";
}
} else {
echo "No articles found.";
}
// คำนวณจำนวนหน้าทั้งหมด
$sqlCount = "SELECT COUNT(*) AS total FROM articles";
$resultCount = $conn->query($sqlCount);
$rowCount = $resultCount->fetch_assoc();
$totalItems = $rowCount["total"];
$totalPages = ceil($totalItems / $itemsPerPage);
// สร้างปุ่มนำทาง
echo "<div class='pagination'>";
for ($i = 1; $i <= $totalPages; $i++) {
echo "<a href='?page=" . $i . "'>" . $i . "</a>";
}
echo "</div>";
$conn->close();
?>
โค้ดตัวอย่างนี้เป็น PHP ที่ดึงข้อมูลบทความจากฐานข้อมูล MySQL โดยใช้ LIMIT และ offset เพื่อแสดงผลบทความสำหรับหน้าปัจจุบัน นอกจากนี้ยังมีการคำนวณจำนวนหน้าทั้งหมดและสร้างปุ่มนำทางเพื่อให้ผู้ใช้สามารถไปยังหน้าต่างๆ ได้
ข้อควรระวัง: ในการใช้งานจริง ควรมีการ sanitize และ validate ค่า page ที่รับมาจาก query string เพื่อป้องกันการโจมตีแบบ SQL Injection และ XSS
สรุป
LIMIT Clause เป็นเครื่องมือที่มีประโยชน์อย่างมากในการจัดการกับข้อมูลจำนวนมากใน MySQL ช่วยให้เราสามารถจำกัดจำนวนแถวที่แสดงผลและสร้างระบบ pagination ได้อย่างง่ายดาย การเข้าใจวิธีการใช้งาน LIMIT อย่างถูกต้องจะช่วยให้เราสามารถพัฒนาแอปพลิเคชันที่ทำงานได้อย่างมีประสิทธิภาพและเป็นมิตรต่อผู้ใช้
ในบทต่อไป เราจะมาเรียนรู้เกี่ยวกับ LIKE Clause ซึ่งเป็นเครื่องมือที่ใช้ในการค้นหาข้อมูลที่มีรูปแบบเฉพาะเจาะจง