Trong MySQL, khi bạn muốn giới hạn số lượng bản ghi trả về từ một truy vấn SELECT, bạn có thể sử dụng mệnh đề LIMIT. Mệnh đề này rất hữu ích khi bạn làm việc với một lượng lớn dữ liệu và chỉ muốn truy xuất một số bản ghi nhất định. Mệnh đề LIMIT thường được sử dụng để phân trang (pagination) hoặc khi bạn chỉ muốn lấy một vài bản ghi đầu tiên.
Bài viết này sẽ hướng dẫn bạn cách sử dụng mệnh đề LIMIT trong PHP MySQL với cả hai phương pháp mysqli và PDO.
1. Cú pháp của LIMIT
SELECT column_name(s) FROM table_name
LIMIT [offset,] row_count;row_count: Số lượng bản ghi cần truy xuất.offset(tùy chọn): Vị trí bắt đầu của bản ghi trong kết quả trả về. Nếu không sử dụngoffset, kết quả sẽ bắt đầu từ bản ghi đầu tiên.
Ví dụ:
LIMIT 5: Trả về 5 bản ghi đầu tiên.LIMIT 5, 10: Bỏ qua 5 bản ghi đầu tiên, sau đó trả về 10 bản ghi tiếp theo.
2. Sử dụng LIMIT với mysqli
a) Hướng đối tượng (OOP)
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "my_database";
// Tạo kết nối
$conn = new mysqli($servername, $username, $password, $dbname);
// Kiểm tra kết nối
if ($conn->connect_error) {
die("Kết nối thất bại: " . $conn->connect_error);
}
// Câu lệnh SQL sử dụng LIMIT
$sql = "SELECT id, username, email FROM Users LIMIT 5";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// Lặp qua các bản ghi kết quả
while ($row = $result->fetch_assoc()) {
echo "ID: " . $row["id"] . " - Username: " . $row["username"] . " - Email: " . $row["email"] . "<br>";
}
} else {
echo "Không có kết quả.";
}
// Đóng kết nối
$conn->close();
?>Giải thích:
LIMIT 5: Câu lệnh này chỉ trả về 5 bản ghi đầu tiên từ bảngUsers.$result->num_rows: Kiểm tra xem có bao nhiêu bản ghi được trả về.$result->fetch_assoc(): Lấy từng bản ghi dưới dạng mảng kết hợp.
b) Hướng thủ tục
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "my_database";
// Tạo kết nối
$conn = mysqli_connect($servername, $username, $password, $dbname);
// Kiểm tra kết nối
if (!$conn) {
die("Kết nối thất bại: " . mysqli_connect_error());
}
// Câu lệnh SQL sử dụng LIMIT
$sql = "SELECT id, username, email FROM Users LIMIT 3";
$result = mysqli_query($conn, $sql);
if (mysqli_num_rows($result) > 0) {
// Lặp qua các bản ghi kết quả
while ($row = mysqli_fetch_assoc($result)) {
echo "ID: " . $row["id"] . " - Username: " . $row["username"] . " - Email: " . $row["email"] . "<br>";
}
} else {
echo "Không có kết quả.";
}
// Đóng kết nối
mysqli_close($conn);
?>Giải thích:
LIMIT 3: Trả về 3 bản ghi đầu tiên từ bảngUsers.mysqli_fetch_assoc(): Trả về mỗi bản ghi dưới dạng mảng kết hợp và lặp qua từng bản ghi.
3. Sử dụng LIMIT với PDO
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "my_database";
try {
// Tạo kết nối PDO
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// Câu lệnh SQL sử dụng LIMIT
$stmt = $conn->prepare("SELECT id, username, email FROM Users LIMIT 4");
$stmt->execute();
// Lấy kết quả trả về dưới dạng mảng kết hợp
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
if ($stmt->rowCount() > 0) {
foreach ($result as $row) {
echo "ID: " . $row['id'] . " - Username: " . $row['username'] . " - Email: " . $row['email'] . "<br>";
}
} else {
echo "Không có kết quả.";
}
} catch(PDOException $e) {
echo "Lỗi: " . $e->getMessage();
}
// Đóng kết nối
$conn = null;
?>Giải thích:
LIMIT 4: Trả về 4 bản ghi đầu tiên từ bảngUsers.fetchAll(PDO::FETCH_ASSOC): Lấy tất cả các bản ghi và trả về dưới dạng mảng kết hợp.rowCount(): Trả về số lượng bản ghi trả về từ truy vấnSELECT.
4. Sử dụng LIMIT với phân trang (pagination)
Một ứng dụng phổ biến của mệnh đề LIMIT là trong việc phân trang. Khi bạn có một lượng lớn dữ liệu, bạn có thể chỉ muốn hiển thị một số bản ghi nhất định trên mỗi trang và cho phép người dùng chuyển đổi giữa các trang.
Ví dụ: Hiển thị 5 bản ghi trên mỗi trang
Trong ví dụ dưới đây, ta sẽ sử dụng LIMIT và OFFSET để tạo phân trang.
Bước 1: Tạo trang với phân trang
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "my_database";
// Tạo kết nối
$conn = new mysqli($servername, $username, $password, $dbname);
// Kiểm tra kết nối
if ($conn->connect_error) {
die("Kết nối thất bại: " . $conn->connect_error);
}
// Xác định số bản ghi hiển thị trên mỗi trang
$limit = 5;
// Xác định trang hiện tại (nếu không có giá trị mặc định là 1)
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
// Tính toán vị trí bắt đầu
$start = ($page - 1) * $limit;
// Câu lệnh SQL với LIMIT và OFFSET
$sql = "SELECT id, username, email FROM Users LIMIT $start, $limit";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// Hiển thị dữ liệu
while ($row = $result->fetch_assoc()) {
echo "ID: " . $row["id"] . " - Username: " . $row["username"] . " - Email: " . $row["email"] . "<br>";
}
} else {
echo "Không có kết quả.";
}
// Đếm tổng số bản ghi
$sql_total = "SELECT COUNT(id) AS total FROM Users";
$result_total = $conn->query($sql_total);
$row_total = $result_total->fetch_assoc();
$total_records = $row_total['total'];
// Tính toán tổng số trang
$total_pages = ceil($total_records / $limit);
// Hiển thị liên kết trang
for ($i = 1; $i <= $total_pages; $i++) {
echo "<a href='pagination.php?page=$i'>$i</a> ";
}
// Đóng kết nối
$conn->close();
?>Giải thích:
LIMIT $start, $limit: Trả vềlimitsố bản ghi bắt đầu từ vị trístart.- Phân trang: Chúng ta xác định
pagethông qua tham số URL ($_GET['page']). Sau đó tính toán vị trí bắt đầu của các bản ghi dựa trên trang hiện tại. - Tổng số trang: Sử dụng hàm
COUNT()để tính tổng số bản ghi trong bảng, sau đó chia số bản ghi này cho số bản ghi trên mỗi trang ($limit).
Bước 2: Hiển thị phân trang
Truy cập URL như sau để hiển thị các trang khác nhau:
pagination.php?page=1
pagination.php?page=2
...Kết quả:
- Nếu có 20 bản ghi trong bảng
Users, bạn sẽ thấy liên kết trang từ 1 đến 4 (với 5 bản ghi trên mỗi trang). - Mỗi lần nhấp vào liên kết trang sẽ tải một tập hợp mới của các bản ghi tương ứng.
5. Kết luận
Mệnh đề LIMIT trong SQL là một công cụ mạnh mẽ để giới hạn số lượng bản ghi được trả về từ cơ sở dữ liệu MySQL. Khi sử dụng PHP, bạn có thể kết hợp LIMIT với các phương thức mysqli hoặc PDO để giới hạn và phân trang dữ liệu một cách hiệu quả.
mysqli: Hỗ trợ cả hai mô hình hướng đối tượng và hướng thủ tục.- PDO: Cung cấp một cách tiếp cận linh hoạt và mạnh mẽ cho việc truy vấn dữ liệu từ MySQL.
Sử dụng LIMIT đặc biệt hữu ích khi bạn làm việc với các bảng lớn và muốn giảm tải lượng dữ liệu hiển thị trên mỗi trang, giúp tăng hiệu suất và trải nghiệm người dùng tốt hơn.









