Lấy bản ghi cao nhất thứ n trong MySQL

Like
Like Love Haha Wow Sad Angry

Trong bài viết này sẽ hướng dẫn bạn cách lấy bản ghi thứ n cao nhất trong bảng dữ liệu.

Nếu yêu cầu lấy bản ghi cao nhất hoặc thấp nhất thì rất đơn giản chỉ cần sử dụng hàm MAX hoặc MIN. Vậy nếu chỉ lấy bản ghi thứ n cao nhất thì sao? Ví dụ như lấy sản phẩm có giá cao nhất thứ 3 trong bảng products thì sao nhỉ?

Đơn giản thôi, chỉ cần làm theo các bước sau:

  • Lấy bản ghi cao nhất thứ n và sắp xếp tăng dần. Khi ấy bản ghi cao nhất là bản ghi cuối cùng.
  • Rồi sắp xếp các bản ghi trả về ở trên giảm dần sau đó lấy bản ghi đầu tiên.

Thứ tự thực hiện như các query dưới đây:

SELECT 
    *
FROM
    table_name
ORDER BY column_name ASC
LIMIT N;

Query để lấy bản ghi cao nhất thứ n:

SELECT 
    *
FROM
    (SELECT 
        *
    FROM
        table_name
    ORDER BY column_name ASC
    LIMIT N) AS tbl
ORDER BY column_name DESC
LIMIT 1;

May mắn là trong MySQL cho phép chúng ta sử dụng LIMIT để ép buộc trả về số dòng trong các kết quả. Ta có thể viết lại query trên một cách ngắn gọn hơn:

SELECT 
    *
FROM
    table_name
ORDER BY column_name DESC
LIMIT n - 1, 1;

Query trả về dòng đầu tiên của n-1 --> đó chính là bản ghi cao nhất thứ n.

Ví dụ lấy bản ghi cao nhất thứ n

Ví dụ lấy sản phẩm thứ 2 đắt nhất (n = 2) trong bảng products:

SELECT 
    productCode, productName, buyPrice
FROM
    products
ORDER BY buyPrice DESC
LIMIT 1 , 1;

MySQL nth Highest Example

Cách thứ 2 để lấy bản ghi cao nhất thứ n là sử dụng MySQL subquery:

SELECT *
FROM table_name AS a 
WHERE n - 1 = (
 SELECT COUNT(primary_key_column) 
 FROM products b 
 WHERE  b.column_name > a. column_name)

Kết quả tương tự cách đầu tiên:

SELECT 
    productCode, productName, buyPrice
FROM
    products a
WHERE
    1 = (SELECT 
            COUNT(productCode)
        FROM
            products b
        WHERE
            b.buyPrice > a.buyPrice);
Like
Like Love Haha Wow Sad Angry

Nếu thấy hay thì like, share và comment để cùng nhau học tập nhé !^^

Bài viết liên quan

Bài viết cùng chuyên mục

Leave a Reply

Your email address will not be published. Required fields are marked *