Heim  >  Artikel  >  Datenbank  >  Wie erstelle ich dynamisch Kreuztabellen in MySQL mit unterschiedlichen Spaltennamen?

Wie erstelle ich dynamisch Kreuztabellen in MySQL mit unterschiedlichen Spaltennamen?

Barbara Streisand
Barbara StreisandOriginal
2024-10-28 08:09:01161Durchsuche

How to Dynamically Create Cross-Tabulations in MySQL with Varying Column Names?

MySQL Dynamic Cross Tabulation

Problem:

Stellen Sie sich eine Tabelle vor, die Attribute wie „ „Weg“, „Stopp“ und „Zeit“. Das Ziel besteht darin, diese Daten in ein Kreuztabellenformat umzuwandeln, in dem Spalten unterschiedliche „Weg“-Werte und Zeilen „Stopp“-Werte darstellen. Jede Zelle enthält die maximale „Zeit“, die für die entsprechende Kombination aus „Weg“ und „Stopp“ aufgezeichnet wurde.

Dynamische Lösung:

Die Einschränkungen von MySQL erfordern, dass Spaltennamen und -nummern angegeben werden muss während der Abfrageausführung behoben werden. Um diese Herausforderung zu meistern, ziehen Sie zwei anwendungsbasierte Ansätze in Betracht:

Option 1: Eindeutige Werte abfragen

  • Eindeutige „Weg“-Werte mithilfe einer SELECT DISTINCT-Abfrage abrufen .
  • Erstellen Sie eine Pivot-Abfrage dynamisch, indem Sie die erforderlichen MAX(IF())-Klauseln an die SELECT-Liste anhängen.
  • Führen Sie die generierte Pivot-Abfrage aus, um das gewünschte Kreuztabellenergebnis zu erhalten.

Option 2: Zeilenweise Verarbeitung

  • Fragen Sie die Daten Zeile für Zeile mit einer einfachen SELECT *-Abfrage ab.
  • Erstellen Sie ein assoziatives Array, das „stop“ als Schlüssel und ein Array von „way“-Werten und entsprechenden „time“-Werten als Wert speichert.
  • Verarbeiten Sie jede Zeile und füllen Sie die way_n-Werte im zugehörigen „stop“ auf " Schlüsselarray.

Implementierung:

Für Option 1:

$way_array = [];
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`";
$pivotstmt = $pdo->query($pivotsql);

Für Option 2:

$stoparray = [];
foreach ($pdo->query("SELECT * FROM `MyTable`") as $row) {
  $stopkey = $row["stop"];
  if (!array_key_exists($stopkey, $stoparray)) {
    $stoparray[$stopkey] = ["stop"=>$stopkey];
  }
  $waykey = "way_" . $row["way"];
  $stoparray[$stopkey][$waykey] = $row["time"];
}

Das obige ist der detaillierte Inhalt vonWie erstelle ich dynamisch Kreuztabellen in MySQL mit unterschiedlichen Spaltennamen?. 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