Convertir les valeurs de lignes dynamiques en noms de colonnes à l'aide de MySQL
Dans les tableaux existants avec des structures fixes, obtenir des données au format pivot peut être un défi. MySQL ne dispose pas de fonctions pivot natives et nécessite l'utilisation d'instructions préparées pour résoudre ce problème.
Considérez le tableau d'héritage suivant :
<code>id name value ------------------------------ 0 timezone Europe/London 0 language en 0 country 45 0 something x 1 timezone Europe/Paris 1 language fr 1 country 46</code>
Sortie souhaitée, utilisant les valeurs de lignes dynamiques comme noms de colonnes :
<code>id timezone language country something --------------------------------------------------- 0 Europe/London en 45 x 1 Europe/Paris fr 46</code>
Contrairement aux autres SGBDR, MySQL nécessite une approche d'indirection. La construction de déclarations préparées est l’approche privilégiée.
<code class="language-sql">SELECT CONCAT( 'SELECT `table`.id', GROUP_CONCAT(' , `t_', REPLACE(name, '`', '``'), '`.value AS `', REPLACE(name, '`', '``'), '`' SEPARATOR ''), ' FROM `table` ', GROUP_CONCAT(' LEFT JOIN `table` AS `t_', REPLACE(name, '`', '``'), '` ON `table`.id = `t_', REPLACE(name, '`', '``'), '`.id AND `t_', REPLACE(name, '`', '``'), '`.name = ', QUOTE(name) SEPARATOR ''), ' GROUP BY `table`.id' ) INTO @qry FROM (SELECT DISTINCT name FROM `table`) t; PREPARE stmt FROM @qry; EXECUTE stmt;</code>
Cette requête utilise GROUP_CONCAT()
pour créer une instruction SQL dynamique afin de connecter les JOIN et les alias de colonne nécessaires. Les instructions SQL générées sont ensuite préparées et exécutées.
Cette approche permet d'utiliser des valeurs de ligne uniques comme noms de colonnes variables sans avoir besoin de sous-sélections codées en dur ou d'instructions CASE. Bien que cela puisse nécessiter plus de configuration, il fournit une solution plus flexible et plus efficace pour faire pivoter les données dans MySQL.
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!