Når du driver en e-handelsvirksomhed eller onlinebutik, skal du muligvis vælge top 10 poster for hver kategori af produkter, mærker osv. til rapportering og analyse. I denne artikel vil vi se på, hvordan man vælger top 10 poster for hver kategori i MySQL.
Vælg top 10 poster for hver kategori
Her er trinene til at vælge top 10 poster for hver kategori. Lad os sige, at du har følgende tabel salg(id, produkt, ordredato, beløb) .
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 | +------+---------+------------+--------+
Bonuslæser:Almindelig tabeludtryk i MySQL
Vi udvælger top 10 poster efter beløb kolonne for hver kategori (produkt). Først vil vi rangere hver række inden for dens gruppe (produkt).
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 | +------+---------+--------+--------------+-----------------+
I ovenstående forespørgsel bruger vi midlertidige variabler product_rank og aktuelt_produkt at holde styr på seneste rangværdi og produktværdi.
Bonus Læs:Sådan beregnes margin i MySQL
Dernæst vil vi bruge ovenstående forespørgsel som en underforespørgsel til at vælge top 10 poster for hvert produkt.
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 | +------+---------+--------+
Bonuslæser:Sådan vælger du bedst sælgende produkter ved hjælp af SQL
Vi har brugt betingelsen hvor product_rank<=10 for kun at vælge top 10 poster. Du kan ændre den for at vælge så mange rækker, som du ønsker.
Har du brug for et rapporteringsværktøj til MySQL? Ubiq gør det nemt at visualisere data på få minutter og overvåge i dashboards i realtid. Prøv det i dag!