Heim >Datenbank >MySQL-Tutorial >Wie kann ich eine MySQL-Tabelle mit dynamischen Spaltennamen aus Zeilenwerten Pivotieren?

Wie kann ich eine MySQL-Tabelle mit dynamischen Spaltennamen aus Zeilenwerten Pivotieren?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-13 19:46:48367Durchsuche

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

MySQL: Dynamische Zeilenwerte als Spaltennamen

Frage:

Wie erstellt man eine MySQL-Abfrage, die eine alte Tabelle mit variablen Spaltennamen in eine Tabelle mit festen Spaltennamen konvertiert, wobei jeder eindeutige Zeilenwert für eine bestimmte Spalte zu einem Spaltennamen wird?

Hintergrund:

Betrachten Sie eine Tabelle mit der folgenden Struktur:

<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>

Anforderungen:

Konvertieren Sie die Tabelle in das folgende Format:

<code>id    timezone       language    country  something
---------------------------------------------------
0     Europe/London  en          45       x
1     Europe/Paris   fr          46</code>

MySQL unterstützt keine nativen Pivot-Operationen, daher müssen wir eine Problemumgehung finden.

Lösung:

    Mit der Funktion
  • GROUP_CONCAT() können dynamisch Abfragen generiert werden, die das gewünschte Tabellenformat erstellen.
  • Die erste Abfrage bereitet eine Zeichenfolge vor, die GROUP_CONCAT() zum Erstellen der endgültigen Abfrage verwendet.
  • Die zweite Abfrage verwendet PREPARE und EXECUTE, um eine dynamisch generierte Abfrage auszuführen.

Abfrage:

<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>

Hinweis:

  • GROUP_CONCAT() Die Länge des Ergebnisses wird durch die Variable group_concat_max_len begrenzt (Standard ist 1024 Byte).
  • Alternativ kann man vorbereitete Anweisungen mit CASE WHEN oder mehreren Unterauswahlen/Joins verwenden, dies erfordert jedoch eine manuelle Handhabung eindeutiger Spaltenwerte.

Das obige ist der detaillierte Inhalt vonWie kann ich eine MySQL-Tabelle mit dynamischen Spaltennamen aus Zeilenwerten Pivotieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn