Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да изберете най-добрите N реда на група в MySQL

Понякога може да се наложи да изберете горните N реда от всяка група в MySQL. Ето как да изберете първите N реда на група в MySQL. Можете да го използвате, за да получите топ n резултата на група, да изберете топ 10 записа за всяка категория или да изберете първия запис от всяка група.

MySQL Изберете най-добрите N реда на група

Ето стъпките за избор на горни N реда на група. Да приемем, че имате следната таблица поръчки (идентификатор, продукт, количество)

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 |
+------+---------+--------+

Бонус четене:Как да получите данни от миналата седмица в MySQL

Как да изберете най-добрите N реда на група в MySQL

Първо, ще класираме всеки ред в неговата група (продукт колона) с помощта на следната SQL заявка.

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                           |
+------+---------+--------+--------------+-----------------------------+

В горната заявка първо сме сортирали всеки запис в неговата група по колона за сума в низходящ ред и след това го класирахме. Ако искате да го сортирате във възходящ ред на сумите, можете да го направите, като промените клаузата ORDER by.

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;

След това използваме горната заявка като подзаявка, за да изберем първите N реда на група (напр. първите 2 реда за всяка категория).

Бонус четене:MySQL Copy Database

Как да изберете първите 2 реда на група

Ето SQL заявката за избор на първите 2 реда за всяка група, използвайки горния метод. Ще използваме горната заявка като подзаявка и ще изберем редове, чийто ранг е по-малък или равен на 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 |
+------+---------+--------+

Бонус четене:MySQL Вмъкване в Select

Как да изберете първите 10 реда на група

По същия начин можете да изберете първите 10 реда от всяка група, като използвате следната заявка.

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;

Надяваме се, че сега можете лесно да изберете най-добрите N реда на група в MySQL.

Ubiq улеснява визуализирането на данни за минути и наблюдение в табла за управление в реално време. Опитайте днес!

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Намерете дублиращи се записи в MySQL

  2. Как да получа следващия/предишен запис в MySQL?

  3. Как да архивирате вашата база данни Chamilo LMS MySQL

  4. Как да създадете база данни с множество наематели със споделени структури на таблици?

  5. .NET Core 2.1 Identity получава всички потребители с техните свързани роли