MySQL динамическая кросс-таблица - PullRequest
4 голосов
/ 24 января 2012

У меня есть такая таблица:

way     stop    time
1       1       00:55
1       2       01:01
1       3       01:07
2       2       01:41
2       3       01:47
2       5       01:49
3       1       04:00
3       2       04:06
3       3       04:12

и я хочу такой стол:

stop    way_1   way_2   way_3   (way_n)
1       00:55           04:00
2       01:01   01:41   04:06
3       01:07   01:47   04:12
5               01:49

Есть много решений в Интернете о кросс-таблице MySQL (сводная таблица), но как я могу это сделать, если я не знаю, сколько существует «путей»? Спасибо

1 Ответ

4 голосов
/ 24 января 2012

Количество и имена столбцов должны быть фиксированными во время подготовки запроса.Именно так работает SQL.

Итак, у вас есть два варианта решения этой проблемы.Оба варианта включают в себя написание кода приложения:

(1) Запросить отдельные значения из way и затем написать код, чтобы использовать их для построения сводного запроса, добавив столько столбцов в SELECT-пишите в качестве количества различных значений.

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

Теперь вы можете запустить новый запрос, и в нем будет столько столбцов, сколько количество различных значений way.

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

(2) Запросите строку данных за строкой , как она структурирована в вашей базе данных, а затем напишите код для поворота в столбцы перед отображением данных.

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

Теперь у вас естьмассив массивов, который выглядит так же, как если бы вы выполняли сводный запрос, но фактический SQL-запрос, который вы выполняли, был намного проще.Вы обработали результат запроса в другой набор массивов.

...