PIVOTAGE dynamique dans MySQL
Dans notre base de données relationnelle, nous avons une table nommée « Parts » qui contient des informations sur les pièces du produit, y compris leur ID de pièce, type de pièce et ID de produit associé. La structure du tableau ressemble à la suivante :
Parts -------------------------------------- part_id | part_type | product_id -------------------------------------- 1 | A | 1 2 | B | 1 3 | A | 2 4 | B | 2 5 | A | 3 6 | B | 3
Objectif :
Notre objectif est de construire une requête qui transforme ces données dans un format croisé, ce qui donne un tableau avec une ligne pour chaque ID de produit unique, ainsi que des colonnes représentant les ID de pièce correspondants pour les types « A » et « B ». La table de sortie souhaitée devrait ressembler à ceci :
Product_ID | Part_A_ID | Part _B_ID ---------------------------------------- 1 | 1 | 2 2 | 3 | 4 3 | 5 | 6
Solution :
Malheureusement, MySQL ne dispose pas d'une fonction PIVOT native. Cependant, nous pouvons simuler son comportement en utilisant une combinaison de fonctions d'agrégation et d'instructions CASE. Pour créer une version dynamique qui gère plusieurs types de pièces, nous utilisons des instructions préparées :
SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT( 'max(case when part_type = ''', part_type, ''' then part_id end) AS part_', part_type, '_id' ) ) INTO @sql FROM parts; SET @sql = CONCAT('SELECT product_id, ', @sql, ' FROM parts GROUP BY product_id'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
Cette requête construit dynamiquement une instruction SQL basée sur les types de pièces uniques dans la table « Parts ». Il utilise ensuite des instructions préparées pour exécuter l'instruction SQL générée, gérant ainsi efficacement les problèmes de performances potentiels avec des ensembles de résultats volumineux.
Alternative pour une solution statique avec un nombre limité de colonnes :
Si nous avons un nombre limité de types de pièces, nous pouvons utiliser une version statique de la requête :
select product_id, max(case when part_type ='A' then part_id end) as Part_A_Id, max(case when part_type ='B' then part_id end) as Part_B_Id from parts group by product_id
Cette alternative est recommandée lorsque le nombre de types de pièces est fixe et petit.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!