Maison > Questions et réponses > le corps du texte
P粉6048485882023-08-28 16:02:00
Mon approche est légèrement différente de la réponse acceptée. De cette façon, vous évitez d'utiliser GROUP_CONCAT, qui a une limite par défaut de 1024 caractères, ce qui ne fonctionnera pas si vous avez beaucoup de champs à moins que vous ne modifiiez la limite.
SET @sql = ''; SELECT @sql := CONCAT(@sql,if(@sql='','',', '),temp.output) FROM ( SELECT DISTINCT CONCAT( 'MAX(IF(pa.fieldname = ''', fieldname, ''', pa.fieldvalue, NULL)) AS ', fieldname ) as output FROM product_additional ) as temp; 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 stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
P粉4959559862023-08-28 10:33:43
La seule façon de faire cela de manière dynamique dans MySQL est d'utiliser des instructions préparées. Voici un excellent article à leur sujet :
Tableau croisé dynamique (convertir les lignes en colonnes)
Votre code ressemblera à ceci :
SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT( 'MAX(IF(pa.fieldname = ''', fieldname, ''', pa.fieldvalue, NULL)) AS ', fieldname ) ) INTO @sql FROM product_additional; 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 stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
Voir Démo
Remarque : La fonction GROUP_CONCAT a une limite de longueur de 1 024 caractères. Afficher le paramètre group_concat_max_len