Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Lấy hàng có giá trị nhỏ nhất (MIN) theo nhóm trong MySQL

Để tìm hàng có giá trị nhỏ nhất của một cột trong mỗi nhóm (ví dụ: ID nhỏ nhất cho mỗi NumberOfProduct), dùng hàm tổng hợp MIN() kết hợp GROUP BY.

Tạo bảng và dữ liệu

mysql> CREATE TABLE DemoTable (
    Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    NumberOfProduct INT
);

mysql> INSERT INTO DemoTable (NumberOfProduct) VALUES (40), (40), (60), (60);

Dữ liệu

mysql> SELECT * FROM DemoTable;
+----+-----------------+
| Id | NumberOfProduct |
+----+-----------------+
|  1 |              40 |
|  2 |              40 |
|  3 |              60 |
|  4 |              60 |
+----+-----------------+

Truy vấn: Lấy ID nhỏ nhất cho mỗi NumberOfProduct

mysql> SELECT NumberOfProduct, MIN(Id) FROM DemoTable 
GROUP BY NumberOfProduct;

Kết quả

+-----------------+---------+
| NumberOfProduct | MIN(Id) |
+-----------------+---------+
|              40 |       1 |
|              60 |       3 |
+-----------------+---------+

Mở rộng: Lấy toàn bộ hàng (các cột khác) có MIN

GROUP BY chỉ cho phép chọn cột gom nhóm hoặc hàm tổng hợp. Để lấy toàn bộ hàng, dùng JOIN hoặc Window Function (MySQL 8.0+):

Cách 1: JOIN (tương thích mọi phiên bản)

SELECT d1.* FROM DemoTable d1
JOIN (
    SELECT NumberOfProduct, MIN(Id) AS min_id
    FROM DemoTable GROUP BY NumberOfProduct
) d2 ON d1.NumberOfProduct = d2.NumberOfProduct AND d1.Id = d2.min_id;

Cách 2: ROW_NUMBER() (MySQL 8.0+)

SELECT * FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY NumberOfProduct ORDER BY Id) AS rn
    FROM DemoTable
) t WHERE rn = 1;

Cách 2 ngắn gọn, hiệu năng tốt, dễ mở rộng lấy Top-N mỗi nhóm.