sql >> Databáze >  >> RDS >> Mysql

Dynamická křížová karta MySQL

Počet a názvy sloupců musí být pevně stanoveny v době přípravy dotazu. Přesně tak SQL funguje.

Máte tedy dvě možnosti, jak to vyřešit. Obě možnosti zahrnují zápis kódu aplikace:

(1) Dotaz na odlišné hodnoty way a poté napište kód, který je použije k vytvoření pivotního dotazu, a připojte tolik sloupců v seznamu SELECT, kolik je různých hodnot.

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

Nyní můžete spustit nový dotaz a má tolik sloupců, kolik je různých way hodnoty.

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

(2) Dotazujte se na data řádek po řádku jak je strukturováno ve vaší databázi, a poté zapište kód, který se rozloží do sloupců, než zobrazíte 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"];
}

Nyní máte pole polí, které vypadá stejně, jako kdybyste spustili pivotní dotaz, ale skutečný SQL, který jste spustili, byl mnohem jednodušší. Výsledek dotazu jste následně zpracovali do jiné sady polí.




  1. Jak se vyhnout substituci proměnných v Oracle SQL Developer s „trinidad &tobago“

  2. Je možné provést funkci bitové skupiny?

  3. Problém s přetrváváním java.util.Date do MySql pomocí Hibernate

  4. Jak vložit DECIMAL do databáze MySQL