Heim > Datenbank > MySQL-Tutorial > Hauptteil

Wie erstelle ich dynamisch kreuztabellierte Tabellen in MySQL?

Mary-Kate Olsen
Freigeben: 2024-10-29 09:27:30
Original
786 Leute haben es durchsucht

How to Dynamically Create Cross-Tabulated Tables in MySQL?

MySQL Dynamic Cross Tab

Problem:

Sie haben eine Tabelle mit Daten mit mehreren Dimensionen und möchten dies tun Erstellen Sie dynamisch eine Kreuztabelle (Pivot-Tabelle), ohne die Anzahl der Dimensionen im Voraus zu kennen.

Lösung:

Die Anzahl der Spalten für eine Pivot-Abfrage muss definiert werden zur Zeit der Abfragevorbereitung. Um eine dynamische Kreuztabelle zu erreichen, haben Sie zwei Optionen, die das Schreiben von Anwendungscode erfordern:

Option 1: Abfragen eindeutiger Werte und Erstellen dynamischer SQL

  1. Abfrage für unterschiedliche Werte in der Dimension, die Sie schwenken möchten (z. B. „Weg“).
  2. Erstellen Sie ein Array von SQL-Fragmenten, die die maximale Zeit für jeden einzelnen Dimensionswert darstellen.
  3. Fügen Sie die SQL-Fragmente hinzu eine einzelne Abfragezeichenfolge mit Kommas.
  4. Führen Sie die dynamische Pivot-Abfrage mit der konstruierten SQL-Zeichenfolge aus.

Beispiel:

<code class="php">foreach ($pdo->query("SELECT DISTINCT `way` FROM `MyTable`") as $row) {
  $way = (int) $row["way"];
  $way_array[] = "MAX(IF(`way`=$way, `time`)) AS way_$way";
}
$pivotsql = "SELECT stop, " . join(", ", $way_array) .
   "FROM `MyTable` GROUP BY `stop`";</code>
Nach dem Login kopieren

Option 2: Daten Zeile für Zeile abfragen und nachbearbeiten

  1. Fragen Sie die Daten unverändert ab.
  2. Erstellen Sie ein assoziatives Array mit dem ersten Dimensionswert (z. B. , „stop“) als Schlüssel.
  3. Füllen Sie das Array mit Unterarrays, die den zweiten Dimensionswert (z. B. „way“) als Schlüssel und Zeitwerte als Werte enthalten.
  4. Das resultierende Array wird ähneln den Daten einer Pivot-Abfrage.

Beispiel:

<code class="php">$stoparray = array();
foreach ($pdo->query("SELECT * FROM `MyTable`") as $row) {
  $stopkey = $row["stop"];
  if (!array_key_exists($stopkey, $stoparray)) {
    $stoparray[$stopkey] = array("stop"=>$stopkey);
  }
  $waykey = "way_" . $row["way"];
  $stoparray[$stopkey][$waykey] = $row["time"];
}</code>
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie erstelle ich dynamisch kreuztabellierte Tabellen in MySQL?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage