sql >> Databasteknik >  >> RDS >> Mysql

MySQL dynamisk korsflik

Antalet och namnen på kolumner måste fastställas när du förbereder frågan. Det är precis så SQL fungerar.

Så du har två val för hur du ska lösa detta. Båda valen innebär att du skriver applikationskod:

(1) Fråga de distinkta värdena av way och skriv sedan kod för att använda dessa för att konstruera pivotfrågan, lägg till lika många kolumner i SELECT-listan som antalet distinkta värden.

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öra den nya frågan, och den har lika många kolumner som antalet distinkta way värden.

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

(2) Fråga data rad för rad som den är strukturerad i din databas och skriv sedan kod för att pivotera in i kolumner innan du visar data.

$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 en array av arrayer som ser ut som om du hade kört en pivotfråga, men den faktiska SQL du körde var mycket enklare. Du efterbehandlade frågeresultatet till en annan uppsättning arrayer.




  1. Vad är det korrekta indexet för att fråga strukturer i arrayer i Postgres jsonb?

  2. Dela CLOB-kolumn baserat på ny rad - Oracle SQL

  3. MYSQL-fråga - få rader där priset ändras

  4. Databasen uppdateras inte med Attach-metoden