sql >> Database teknologi >  >> RDS >> Mysql

MySQL dynamisk krydsfane

Antallet og navnene på kolonner skal være faste på det tidspunkt, du forbereder forespørgslen. Det er bare sådan SQL fungerer.

Så du har to valg af, hvordan du løser dette. Begge valg involverer at skrive ansøgningskode:

(1) Forespørg på de forskellige værdier af way og skriv derefter kode for at bruge disse til at konstruere pivotforespørgslen, ved at tilføje lige så mange kolonner i SELECT-listen som antallet af distinkte værdier.

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 kan du køre den nye forespørgsel, og den har lige så mange kolonner som antallet af distinkte way værdier.

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

(2) Forespørg dataene række for række som det er struktureret i din database, og skriv derefter kode for at pivotere i kolonner, før du viser dataene.

$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 har du et array af arrays, der ser det samme ud, som hvis du havde kørt en pivot-forespørgsel, men den faktiske SQL, du kørte, var meget enklere. Du efterbehandlede forespørgselsresultatet til et andet sæt arrays.




  1. MYSQL 8 timers timeout-problem

  2. Registrerer UNIX tidszone?

  3. Styret acyklisk graf:find alle stier fra en bestemt knude

  4. MySQL Performance Tuning Tips til at optimere databasen