MySQL : Valeurs de lignes dynamiques comme noms de colonnes
Question :
Comment créer une requête MySQL qui convertit une ancienne table avec des noms de colonnes variables en une table avec des noms de colonnes fixes, où chaque valeur de ligne unique pour une colonne spécifique devient un nom de colonne ?
Contexte :
Considérons un tableau avec la structure suivante :
<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>
Exigences :
Convertissez le tableau au format suivant :
<code>id timezone language country something --------------------------------------------------- 0 Europe/London en 45 x 1 Europe/Paris fr 46</code>
MySQL ne prend pas en charge les opérations pivot natives, nous devons donc trouver une solution de contournement.
Solution :
GROUP_CONCAT()
peut être utilisée pour générer dynamiquement des requêtes qui créent le format de tableau souhaité. GROUP_CONCAT()
pour construire la requête finale. PREPARE
et EXECUTE
pour exécuter une requête générée dynamiquement. Requête :
<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>
Remarque :
GROUP_CONCAT()
La longueur du résultat est limitée par la variable group_concat_max_len
(la valeur par défaut est de 1024 octets). CASE WHEN
ou plusieurs sous-sélections/jointures, mais cela nécessite une gestion manuelle des valeurs de colonne uniques. 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!