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

Comment sélectionner les N premières lignes par groupe dans MySQL

Parfois, vous devrez peut-être sélectionner les N premières lignes de chaque groupe dans MySQL. Voici comment sélectionner les N premières lignes par groupe dans MySQL. Vous pouvez l'utiliser pour obtenir les n premiers résultats par groupe, sélectionner les 10 meilleurs enregistrements pour chaque catégorie ou sélectionner le premier enregistrement de chaque groupe.

MySQL Sélectionner les N premières lignes par groupe

Voici les étapes pour sélectionner les N premières lignes par groupe. Disons que vous avez le tableau suivant commandes (id, produit, montant)

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

Lecture bonus :comment obtenir les données de la semaine dernière dans MySQL

Comment sélectionner les N premières lignes par groupe dans MySQL

Tout d'abord, nous allons classer chaque ligne au sein de son groupe (produit colonne) à l'aide de la requête SQL suivante.

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

Dans la requête ci-dessus, nous avons d'abord trié chaque enregistrement de son groupe par colonne de montant dans l'ordre décroissant, puis nous l'avons classé. Si vous souhaitez le trier par ordre croissant de montants, vous pouvez le faire en modifiant la clause 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;

Ensuite, nous utilisons la requête ci-dessus comme sous-requête, pour sélectionner les N premières lignes par groupe (par exemple, les 2 premières lignes pour chaque catégorie).

Lecture bonus :copie de la base de données MySQL

Comment sélectionner les 2 premières lignes par groupe

Voici la requête SQL pour sélectionner les 2 premières lignes pour chaque groupe en utilisant la méthode ci-dessus. Nous utiliserons la requête ci-dessus comme sous-requête et sélectionnerons les lignes dont le rang est inférieur ou égal à 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 |
+------+---------+--------+

Lecture bonus :Insertion MySQL dans Select

Comment sélectionner les 10 premières lignes par groupe

De même, vous pouvez sélectionner les 10 premières lignes de chaque groupe à l'aide de la requête suivante.

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;

Heureusement, vous pouvez désormais sélectionner facilement les N premières lignes par groupe dans 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 !