Понякога може да се наложи да изберете горните 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 улеснява визуализирането на данни за минути и наблюдение в табла за управление в реално време. Опитайте днес!