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
Libérer: 2025-01-13 19:46:48
original
364 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal