Mysql
 sql >> Base de données >  >> RDS >> Mysql

Sélectionnez les 10 meilleurs enregistrements pour chaque catégorie dans MySQL

Lorsque vous exploitez une entreprise de commerce électronique ou une boutique en ligne, vous devrez peut-être sélectionner les 10 meilleurs enregistrements pour chaque catégorie de produits, marques, etc. pour les rapports et l'analyse. Dans cet article, nous verrons comment sélectionner les 10 meilleurs enregistrements pour chaque catégorie dans MySQL.


Sélectionnez les 10 meilleurs enregistrements pour chaque catégorie

Voici les étapes pour sélectionner les 10 meilleurs enregistrements pour chaque catégorie. Disons que vous avez le tableau suivant ventes(id, produit, date_commande, montant) .

mysql> create table sales(id int, 
        product  varchar(255), 
        order_date date, 
        amount int);

mysql> insert into sales(id, product, order_date, amount)
      values(1,'A','2021-01-01',125),
      (2,'A','2021-01-02',225),
      (3,'A','2021-01-03',325),
      (4,'A','2021-01-04',105),
      (5,'A','2021-01-05',150),
      (6,'A','2021-01-06',215),
      (7,'A','2021-01-07',205),
      (8,'A','2021-01-08',125),
      (9,'A','2021-01-09',350),
      (10,'A','2021-01-10',235),
      (11,'A','2021-01-11',325),
      (12,'B','2021-01-01',150),
      (13,'B','2021-01-02',165),
      (14,'B','2021-01-03',145),
      (15,'B','2021-01-04',115),
      (16,'B','2021-01-05',105),
      (17,'B','2021-01-06',195),
      (18,'B','2021-01-07',185),
      (19,'B','2021-01-08',175),
      (20,'B','2021-01-09',165),
      (21,'B','2021-01-10',115),
      (22,'B','2021-01-11',125);


 mysql> select * from sales;
 +------+---------+------------+--------+
 | id   | product | order_date | amount |
 +------+---------+------------+--------+
 |    1 | A       | 2021-01-01 |    125 |
 |    2 | A       | 2021-01-02 |    225 |
 |    3 | A       | 2021-01-03 |    325 |
 |    4 | A       | 2021-01-04 |    105 |
 |    5 | A       | 2021-01-05 |    150 |
 |    6 | A       | 2021-01-06 |    215 |
 |    7 | A       | 2021-01-07 |    205 |
 |    8 | A       | 2021-01-08 |    125 |
 |    9 | A       | 2021-01-09 |    350 |
 |   10 | A       | 2021-01-10 |    235 |
 |   11 | A       | 2021-01-11 |    325 |
 |   12 | B       | 2021-01-01 |    150 |
 |   13 | B       | 2021-01-02 |    165 |
 |   14 | B       | 2021-01-03 |    145 |
 |   15 | B       | 2021-01-04 |    115 |
 |   16 | B       | 2021-01-05 |    105 |
 |   17 | B       | 2021-01-06 |    195 |
 |   18 | B       | 2021-01-07 |    185 |
 |   19 | B       | 2021-01-08 |    175 |
 |   20 | B       | 2021-01-09 |    165 |
 |   21 | B       | 2021-01-10 |    115 |
 |   22 | B       | 2021-01-11 |    125 |
 +------+---------+------------+--------+

Lecture bonus :expression de table commune dans MySQL

Nous sélectionnerons les 10 meilleurs enregistrements par montant colonne pour chaque catégorie (produit). Tout d'abord, nous allons classer chaque ligne au sein de son groupe (produit).

mysql> SELECT id, product, amount, 
@product_rank := IF(@current_product = product, @product_rank + 1, 1) AS product_rank, 
@current_product := product as current_product 
      FROM product_orders 
      ORDER BY product, amount desc;

+------+---------+--------+--------------+-----------------+
 | id   | product | amount | product_rank | current_product |
 +------+---------+--------+--------------+-----------------+
 |    9 | A       |    350 |            1 | A               |
 |    3 | A       |    325 |            2 | A               |
 |   11 | A       |    325 |            3 | A               |
 |   10 | A       |    235 |            4 | A               |
 |    2 | A       |    225 |            5 | A               |
 |    6 | A       |    215 |            6 | A               |
 |    7 | A       |    205 |            7 | A               |
 |    5 | A       |    150 |            8 | A               |
 |    1 | A       |    125 |            9 | A               |
 |    8 | A       |    125 |           10 | A               |
 |    4 | A       |    105 |           11 | A               |
 |   17 | B       |    195 |            1 | B               |
 |   18 | B       |    185 |            2 | B               |
 |   19 | B       |    175 |            3 | B               |
 |   20 | B       |    165 |            4 | B               |
 |   13 | B       |    165 |            5 | B               |
 |   12 | B       |    150 |            6 | B               |
 |   14 | B       |    145 |            7 | B               |
 |   22 | B       |    125 |            8 | B               |
 |   15 | B       |    115 |            9 | B               |
 |   21 | B       |    115 |           10 | B               |
 |   16 | B       |    105 |           11 | B               |
 +------+---------+--------+--------------+-----------------+

Dans la requête ci-dessus, nous utilisons les variables temporaires product_rank et produit_actuel pour garder une trace de la dernière valeur de classement et de la valeur du produit.

Lecture bonus :comment calculer la marge dans MySQL

Ensuite, nous utiliserons la requête ci-dessus comme sous-requête, pour sélectionner les 10 premiers enregistrements pour chaque produit.

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 sales ORDER BY product, amount desc ) 
ranked_rows 
where product_rank<=10;
 +------+---------+--------+
 | id   | product | amount |
 +------+---------+--------+
 |    9 | A       |    350 |
 |    3 | A       |    325 |
 |   11 | A       |    325 |
 |   10 | A       |    235 |
 |    2 | A       |    225 |
 |    6 | A       |    215 |
 |    7 | A       |    205 |
 |    5 | A       |    150 |
 |    1 | A       |    125 |
 |    8 | A       |    125 |
 |   17 | B       |    195 |
 |   18 | B       |    185 |
 |   19 | B       |    175 |
 |   20 | B       |    165 |
 |   13 | B       |    165 |
 |   12 | B       |    150 |
 |   14 | B       |    145 |
 |   22 | B       |    125 |
 |   15 | B       |    115 |
 |   21 | B       |    115 |
 +------+---------+--------+

Lecture bonus :Comment sélectionner les produits les plus vendus à l'aide de SQL

Nous avons utilisé la condition où product_rank<=10 pour sélectionner uniquement les 10 premiers enregistrements. Vous pouvez le modifier pour sélectionner autant de lignes que vous le souhaitez.

Besoin d'un outil de reporting pour MySQL ? Ubiq facilite la visualisation des données en quelques minutes et la surveillance dans des tableaux de bord en temps réel. Essayez-le aujourd'hui !