Heim >Datenbank >MySQL-Tutorial >Wie erstelle ich dynamisch kreuztabellierte Tabellen in MySQL?

Wie erstelle ich dynamisch kreuztabellierte Tabellen in MySQL?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-29 09:27:30839Durchsuche

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>

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>

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!

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