Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Dynamische MySQL-Kreuztabelle

Anzahl und Namen der Spalten müssen zum Zeitpunkt der Vorbereitung der Abfrage festgelegt werden. So funktioniert SQL.

Sie haben also zwei Möglichkeiten, wie Sie dies lösen können. Beide Möglichkeiten beinhalten das Schreiben von Anwendungscode:

(1) Abfrage der eindeutigen Werte von way und schreiben Sie dann Code, um diese zum Erstellen der Pivot-Abfrage zu verwenden, und hängen Sie so viele Spalten in der SELECT-Liste an, wie die Anzahl der unterschiedlichen Werte.

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`";

Jetzt können Sie die neue Abfrage ausführen, und sie hat so viele Spalten wie die Anzahl unterschiedlicher way Werte.

$pivotstmt = $pdo->query($pivotsql);

(2) Daten zeilenweise abfragen wie es in Ihrer Datenbank strukturiert ist, und schreiben Sie dann Code, um in Spalten zu schwenken, bevor Sie die Daten anzeigen.

$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"];
}

Jetzt haben Sie ein Array von Arrays, das genauso aussieht, als hätten Sie eine Pivot-Abfrage ausgeführt, aber das eigentliche SQL, das Sie ausgeführt haben, war viel einfacher. Sie haben das Abfrageergebnis in einem anderen Satz von Arrays nachbearbeitet.