Maison >base de données >tutoriel mysql >Comment faire pivoter une table MySQL avec des noms de colonnes dynamiques à partir des valeurs de ligne ?

Comment faire pivoter une table MySQL avec des noms de colonnes dynamiques à partir des valeurs de ligne ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-13 19:46:48364parcourir

How to Pivot a MySQL Table with Dynamic Column Names from Row Values?

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 :

    La fonction
  • GROUP_CONCAT() peut être utilisée pour générer dynamiquement des requêtes qui créent le format de tableau souhaité.
  • La première requête prépare une chaîne qui utilise GROUP_CONCAT() pour construire la requête finale.
  • La deuxième requête utilise 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).
  • Alternativement, on peut utiliser des instructions préparées avec 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn