Votre exigence est de faire pivoter les données du produit et tables product_additional, avec les colonnes remplies dynamiquement en fonction des valeurs de la table product_additional. La requête actuelle, qui utilise l'agrégation conditionnelle avec IF(), n'est pas dynamique et nécessite des modifications manuelles à chaque nouveau champ ajouté.
Pour réaliser un pivotement dynamique dans MySQL, nous peut utiliser des instructions préparées, qui nous permettent de construire une chaîne de requête au moment de l'exécution. Le code suivant illustre cette approche :
-- Initialize @sql variable SET @sql = NULL; -- Dynamically create the query string by iterating over distinct `fieldname` values SELECT GROUP_CONCAT(DISTINCT CONCAT( 'MAX(IF(pa.fieldname = ''', fieldname, ''', pa.fieldvalue, NULL)) AS ', fieldname ) ) INTO @sql FROM product_additional; -- Concatenate the constructed string with the base query SET @sql = CONCAT('SELECT p.id , p.name , p.description, ', @sql, ' FROM product p LEFT JOIN product_additional AS pa ON p.id = pa.id GROUP BY p.id, p.name, p.description'); -- Prepare the query PREPARE stmt FROM @sql; -- Execute the prepared query EXECUTE stmt; -- Deallocate the prepared statement DEALLOCATE PREPARE stmt;
Ce code génère une chaîne de requête dynamique basée sur les valeurs de nom de champ uniques dans la table product_additional. La chaîne est ensuite utilisée pour construire une instruction PREPARE, qui est exécutée puis désallouée.
Notez que la fonction GROUP_CONCAT a une limite de caractères de 1024 caractères. Vous pouvez augmenter cette limite en définissant le paramètre group_concat_max_len.
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!