sql >> Database >  >> RDS >> Mysql

MySQL dynamische kruistabel

Het aantal en de namen van kolommen moeten worden vastgesteld op het moment dat u de query voorbereidt. Dat is precies de manier waarop SQL werkt.

Je hebt dus twee keuzes om dit op te lossen. Beide keuzes omvatten het schrijven van applicatiecode:

(1) Vraag de verschillende waarden op van way en schrijf vervolgens code om deze te gebruiken om de spilquery te construeren, waarbij zoveel kolommen in de SELECT-lijst worden toegevoegd als het aantal verschillende waarden.

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

Nu kunt u de nieuwe query uitvoeren, en deze heeft net zoveel kolommen als het aantal verschillende way waarden.

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

(2) De gegevens rij voor rij opvragen zoals het is gestructureerd in uw database, en schrijf vervolgens code om in kolommen te draaien voordat u de gegevens weergeeft.

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

Nu heb je een array van arrays die er hetzelfde uitziet alsof je een pivot-query had uitgevoerd, maar de eigenlijke SQL die je uitvoerde was een stuk eenvoudiger. Je hebt het zoekresultaat nabewerkt in een andere reeks arrays.




  1. Opgeslagen procedure met meerdere IN-parameters

  2. Fout tijdens het uitvoeren van Mariadb update-instructie

  3. Retourneer een DML-triggertype op een tabel in SQL Server

  4. PostgreSQL JDBC Null String genomen als bytea