Để 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.