1. Mệnh đề Limit là gì?

Mệnh đề LIMIT được sử dụng để hạn chế số lượng hàng (rows) được trả về bởi câu lệnh SELECT. Tính năng này rất hữu ích để tối ưu hóa thời gian tải trang cũng như nâng cao khả năng đọc của trang web. Ví dụ: bạn có thể chia số lượng lớn bản ghi trong nhiều trang bằng cách sử dụng phân trang, trong đó số lượng bản ghi giới hạn sẽ được tải trên mọi trang từ cơ sở dữ liệu khi người dùng yêu cầu trang đó bằng cách nhấp vào liên kết phân trang.

Mệnh đề LIMIT giúp dễ dàng viết mã các kết quả nhiều trang hoặc phân trang bằng SQL và rất hữu ích trên các bảng lớn. Trả lại một số lượng lớn bản ghi có thể ảnh hưởng đến hiệu suất. Mặc định thì tất cả các kết quả của câu truy vấn sẽ được trả về. Tuy nhiên đôi khi ta muốn lấy một số tập hợp nhỏ (một khoảng) của kết quả thôi. Lúc đó có thể dùng LITMIT hỗ trợ trong MySQL, SQLite …

Cú pháp cơ bản của mệnh đề Limit:

SELECT column_name(s) FROM table_name LIMIT row_offset, row_count;

Cú pháp Limit với 2 đối số:

SELECT
    colum1. colum2,...
FROM
    table_name
WHERE
    (expr|colum_1) IN ('value1','value2',...);

Mệnh đề Limit chấp nhận một hoặc hai thông số này phải là một số nguyên dương:

  • Khi hai tham số được chỉ định, tham số đầu tiên chỉ định độ lệch của hàng đầu tiên trả về tức là điểm bắt đầu, trong khi tham số thứ hai chỉ định số lượng hàng sẽ trả về. Phần bù của hàng đầu tiên là 0 (không phải 1).
  • Trong khi đó, khi chỉ có một tham số được cung cấp, nó chỉ định số hàng tối đa để trả về từ đầu tập kết quả.

Ví dụ: để truy xuất ba hàng đầu tiên, bạn có thể sử dụng truy vấn sau:

SELECT * FROM persons LIMIT 3;

Để truy xuất các hàng 2-4 (bao gồm) của một tập hợp kết quả, bạn có thể sử dụng truy vấn sau:

SELECT * FROM persons LIMIT 1, 3;

2. Sử dụng câu lệnh Limit

2.1. Sử dụng lệnh Limit trong MySQL để có được N hàng đầu tiên

Bạn có thể sử dụng lệnh LIMIT để chọn N hàng đầu tiên trong một bảng như sau:

SELECT
    colum1, colum2,...
FORM
    table
LIMIT N;

Ví dụ: để chọn 5 nhân viên đầu tiên trong bảng demo, bạn sử dụng truy vấn sau:

SELECT
    First_name,
    Last_name,
    address
FORM
    demo
LIMIT 5

2.2. Sử dụng lệnh Limit để nhận được giá trị cao nhất và thấp nhất

Câu lệnh LIMIT thường được sử dụng với câu lệnh ORDER BY. Trước tiên, bạn sử dụng mệnh đề ORDER BY để sắp xếp tập kết quả trả về dựa trên các tiêu chí nhất định, và sau đó bạn sử dụng mệnh đề LIMIT để tìm các giá trị thấp nhất hoặc cao nhất.

Ví dụ sau sẽ lấy ra 5 sản phẩm có giá từ cao xuống thấp:

SELECT
    ten_sp,
    anh_sp,
    gia_sp
FORM
    sanpham
ODER BY
    gia_sp DESC
LIMIT 5

2.3. Sử dụng lệnh Limit để nhận giá trị cao nhất thứ N

Một trong những câu hỏi khó nhất trong MySQL là cách chọn giá trị cao thứ n trong tập kết quả, ví dụ, chọn sản phẩm đắt thứ hai (hoặc thứ n), bạn không thể sử dụng hàm MAX hoặc MIN để trả lời. Tuy nhiên, bạn có thể sử dụng MySQL LIMIT để trả lời các loại câu hỏi đó.

  • Đầu tiên, bạn sắp xếp tập hợp kết quả theo thứ tự giảm dần.
  • Thứ hai, bạn sử dụng mệnh đề LIMIT để có được sản phẩm đắt thứ n.

Câu truy vấn chung là:

SELECT
    colum1, colum2,...
FORM
    table
ODER By colum1 DESC
LIMIT nth-1, count;

3. Sử dụng Limit với MySQLi

Hãy xem xét bảng person sau trong cơ sở dữ liệu demo

Id First_name Last_name Email
1 Thành Nguyễn Thanh@gmail.com
2 Nam Chu Nam@gmail.com
3 Sơn Phùng Son@gmail.com
4 Lập trình Từ đầu Laptrinhtudau.com

3.1. Sử dụng Limit với MySQLi hướng thủ tục

<?php
/* Cố gắng kết nối MySQL Servwer. Giả sử bạn đang chạy MySQL
server với thiết lập mặc định (user 'root' và không có mật khẩu) */
$link = mysqli_connect("localhost", "root", "", "demo");
// Kiểm tra kết nối
if($link === false){
    die("ERROR: Không thể kết nối. " . mysqli_connect_error());
}
 // Cố gắng thực hiện truy vấn
$sql = "SELECT * FROM persons LIMIT 3";
if($result = mysqli_query($link, $sql)){
    if(mysqli_num_rows($result) > 0){
        echo "<table>";
            echo "<tr>";
                echo "<th>id</th>";
                echo "<th>first_name</th>";
                echo "<th>last_name</th>";
                echo "<th>email</th>";
            echo "</tr>";
        while($row = mysqli_fetch_array($result)){
            echo "<tr>";
                echo "<td>" . $row['id'] . "</td>";
                echo "<td>" . $row['first_name'] . "</td>";
                echo "<td>" . $row['last_name'] . "</td>";
                echo "<td>" . $row['email'] . "</td>";
            echo "</tr>";
        }
        echo "</table>";
        // Giải phóng bộ nhớ của biến
        mysqli_free_result($result);
    } else{
        echo "Không có bản ghi nào được tìm thấy.";
    }
} else{
    echo "ERROR: Không thể thực thi $sql. " . mysqli_error($link);
} 
// Đóng kết nối
mysqli_close($link);
?>

3.2. Sử dụng Limit với MySQLi hướng đối tượng

<?php
/* Cố gắng kết nối MySQL Servwer. Giả sử bạn đang chạy MySQL
server với thiết lập mặc định (user 'root' và không có mật khẩu) */
$mysqli = new mysqli("localhost", "root", "", "demo");
// Kiểm tra kết nối
if($mysqli === false){
    die("ERROR: Không thể kết nối. " . $mysqli->connect_error);
} 
// Cố gắng thực thi truy vấn
$sql = "SELECT * FROM persons LIMIT 3";
if($result = $mysqli->query($sql)){
    if($result->num_rows > 0){
        echo "<table>";
            echo "<tr>";
                echo "<th>id</th>";
                echo "<th>first_name</th>";
                echo "<th>last_name</th>";
                echo "<th>email</th>";
            echo "</tr>";
        while($row = $result->fetch_array()){
            echo "<tr>";
                echo "<td>" . $row['id'] . "</td>";
                echo "<td>" . $row['first_name'] . "</td>";
                echo "<td>" . $row['last_name'] . "</td>";
                echo "<td>" . $row['email'] . "</td>";
            echo "</tr>";
        }
        echo "</table>";
        // Giải phóng bộ nhớ của biến
        $result->free();
    } else{
        echo "Không có bản ghi nào được tìm thấy.";
    }
} else{
    echo "ERROR: Không thể thực thi $sql. " . $mysqli->error;
} 
// Đóng kết nối
$mysqli->close();
?>

4. Sử dụng Limit với PDO

<?php
/* Cố gắng kết nối MySQL Servwer. Giả sử bạn đang chạy MySQL
server với thiết lập mặc định (user 'root' và không có mật khẩu) */
try{
    $pdo = new PDO("mysql:host=localhost;dbname=demo", "root", "");
    // Thiết lập chế độ PDO error thành Ngoại lệ
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e){
    die("ERROR: Không thể kết nối. " . $e->getMessage());
}
// Cố gắng thực thi truy vấn
try{
    $sql = "SELECT * FROM persons LIMIT 3";  
    $result = $pdo->query($sql);
    if($result->rowCount() > 0){
        echo "<table>";
            echo "<tr>";
                echo "<th>id</th>";
                echo "<th>first_name</th>";
                echo "<th>last_name</th>";
                echo "<th>email</th>";
            echo "</tr>";
        while($row = $result->fetch()){
            echo "<tr>";
                echo "<td>" . $row['id'] . "</td>";
                echo "<td>" . $row['first_name'] . "</td>";
                echo "<td>" . $row['last_name'] . "</td>";
                echo "<td>" . $row['email'] . "</td>";
            echo "</tr>";
        }
        echo "</table>";
        // Giải phóng bộ nhớ của biến
        unset($result);
    } else{
        echo "Không có bản ghi nào được tìm thấy.";
    }
} catch(PDOException $e){
    die("ERROR: Không thể thực thi $sql. " . $e->getMessage());
} 
// Đóng kết nối
unset($pdo);
?>

Kết quả khi sử dụng Limit với các ví dụ trên đều giới hạn bản ghi trả về. Và nếu các bạn để ý thì ở ví dụ những bài gần đây thì mình chỉ cần thay đổi câu lệnh truy vấn SQL còn các câu lệnh khác mình vẫn giữ y nguyên.