Đôi khi bạn có thể cần chọn N hàng trên cùng từ mỗi nhóm trong MySQL. Dưới đây là cách chọn N hàng trên cùng cho mỗi nhóm trong MySQL. Bạn có thể sử dụng nó để nhận n kết quả hàng đầu cho mỗi nhóm, chọn 10 bản ghi hàng đầu cho mỗi danh mục hoặc chọn bản ghi đầu tiên của mỗi nhóm.
MySQL Chọn N dòng hàng đầu cho mỗi nhóm
Dưới đây là các bước để chọn N hàng trên cùng cho mỗi nhóm. Giả sử bạn có bảng sau đơn đặt hàng (id, sản phẩm, số lượng)
mysql> create table product_orders(id int,product varchar(255),amount int); mysql> insert into product_orders(id, product, amount) values(1,'A',250),(2,'B',150),(3,'C',200), (4,'A',250),(5,'B',210),(6,'C',125), (7,'A',350),(8,'B',225),(9,'C',150); mysql> select * from product_orders; +------+---------+--------+ | id | product | amount | +------+---------+--------+ | 1 | A | 250 | | 2 | B | 150 | | 3 | C | 200 | | 4 | A | 250 | | 5 | B | 210 | | 6 | C | 125 | | 7 | A | 350 | | 8 | B | 225 | | 9 | C | 150 | +------+---------+--------+
Phần thưởng đã đọc:Cách nhận dữ liệu tuần trước trong MySQL
Cách chọn N hàng trên mỗi nhóm trong MySQL
Đầu tiên, chúng tôi sẽ xếp hạng từng hàng trong nhóm của nó ( sản phẩm ) bằng cách sử dụng truy vấn SQL sau.
mysql> SELECT id, product, amount, @product_rank := IF(@current_product = product, @product_rank + 1, 1) AS product_rank, @current_product := product FROM product_orders ORDER BY product, amount desc; +------+---------+--------+--------------+-----------------------------+ | id | product | amount | product_rank | @current_product := product | +------+---------+--------+--------------+-----------------------------+ | 7 | A | 350 | 1 | A | | 1 | A | 250 | 2 | A | | 4 | A | 250 | 3 | A | | 8 | B | 225 | 1 | B | | 5 | B | 210 | 2 | B | | 2 | B | 150 | 3 | B | | 3 | C | 200 | 1 | C | | 9 | C | 150 | 2 | C | | 6 | C | 125 | 3 | C | +------+---------+--------+--------------+-----------------------------+
Trong truy vấn trên, trước tiên chúng tôi đã sắp xếp từng bản ghi trong nhóm của nó theo cột số tiền theo thứ tự giảm dần, sau đó xếp hạng nó. Nếu bạn muốn sắp xếp nó theo thứ tự số lượng tăng dần, bạn có thể thực hiện bằng cách thay đổi ĐƠN HÀNG theo mệnh đề.
SELECT id, product, amount, @product_rank := IF(@current_product = product, @product_rank + 1, 1) AS product_rank, @current_product := product FROM product_orders ORDER BY product, amount asc;
Tiếp theo, chúng tôi sử dụng truy vấn ở trên làm truy vấn con, để chọn N hàng trên cùng cho mỗi nhóm (ví dụ:2 hàng trên cùng cho mỗi danh mục).
Phần thưởng Đọc:Cơ sở dữ liệu sao chép MySQL
Cách chọn 2 hàng trên cùng cho mỗi nhóm
Đây là truy vấn SQL để chọn 2 hàng trên cùng cho mỗi nhóm bằng phương pháp trên. Chúng tôi sẽ sử dụng truy vấn trên làm truy vấn con và chọn các hàng có thứ hạng nhỏ hơn hoặc bằng 2.
mysql> select id, product, amount from ( SELECT id, product, amount, @product_rank := IF(@current_product = product, @product_rank + 1, 1) AS product_rank, @current_product := product FROM product_orders ORDER BY product, amount desc) ranked_rows where product_rank<=2; +------+---------+--------+ | id | product | amount | +------+---------+--------+ | 7 | A | 350 | | 1 | A | 250 | | 8 | B | 225 | | 5 | B | 210 | | 3 | C | 200 | | 9 | C | 150 | +------+---------+--------+
Phần thưởng đã đọc:Chèn MySQL vào Lựa chọn
Cách chọn 10 hàng trên cùng cho mỗi nhóm
Tương tự, bạn có thể chọn 10 hàng hàng đầu từ mỗi nhóm bằng cách sử dụng truy vấn sau.
mysql> select id, product, amount from ( SELECT id, product, amount, @product_rank := IF(@current_product = product, @product_rank + 1, 1) AS product_rank, @current_product := product FROM product_orders ORDER BY product, amount desc) ranked_rows where product_rank<=10;
Hy vọng rằng bây giờ bạn có thể dễ dàng chọn N hàng trên cùng cho mỗi nhóm trong MySQL.
Ubiq giúp dễ dàng trực quan hóa dữ liệu trong vài phút và theo dõi trong trang tổng quan thời gian thực. Thử nó ngay hôm nay!