Heim > Datenbank > MySQL-Tutorial > Hauptteil

Wie erstelle ich dynamisch Kreuztabellen in MySQL mit unterschiedlichen Spaltennamen?

Barbara Streisand
Freigeben: 2024-10-28 08:09:01
Original
160 Leute haben es durchsucht

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);
Nach dem Login kopieren

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"];
}
Nach dem Login kopieren

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!

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
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!