Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cách chọn N dòng hàng đầu cho mỗi nhóm trong MySQL

Đô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!

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào tôi có thể sử dụng PDO để tìm nạp một mảng kết quả trong PHP?

  2. Cách so sánh hai cột trong MySQL

  3. Lộ trình học MySQL

  4. Sử dụng đối chiếu nhị phân có những tác dụng gì?

  5. Quyền truy cập bị từ chối đối với người dùng '[email được bảo vệ]' (sử dụng mật khẩu:KHÔNG)