MySQL でさまざまな列名を持つクロス集計表を動的に作成する方法

Barbara Streisand
リリース: 2024-10-28 08:09:01
オリジナル
255 人が閲覧しました

How to Dynamically Create Cross-Tabulations in MySQL with Varying Column Names?

MySQL 動的クロス集計

問題:

「」のような属性を含むテーブルを考えてみましょう。 「道」「停留所」「時間」。目的は、このデータをクロス集計形式に変換することであり、列は個別の「ウェイ」値を表し、行は「ストップ」値を表します。各セルには、対応する「ウェイ」と「停留所」の組み合わせで記録された最大「時間」が含まれています。

動的ソリューション:

MySQL の制限により、列名と番号が決まります。クエリの実行中に修正する必要があります。この課題を克服するには、次の 2 つのアプリケーション ベースのアプローチを検討してください。

オプション 1: 個別の値をクエリする

  • SELECT DISTINCT クエリを使用して個別の「ウェイ」値を取得する.
  • 必要な MAX(IF()) 句を SELECT リストに追加して、ピボット クエリを動的に構築します。
  • 生成されたピボット クエリを実行して、目的のクロス集計結果を取得します。

オプション 2: 行ごとの処理

  • 単純な SELECT * クエリを使用して、行ごとにデータをクエリします。
  • 「stop」をキーとして、「way」の値と対応する「time」の値の配列を値として格納する連想配列を作成します。
  • 各行を処理し、関連付けられた「stop」に way_n の値を入力します。 " キーの配列。

実装:

オプション 1 の場合:

$way_array = [];
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`";
$pivotstmt = $pdo->query($pivotsql);
ログイン後にコピー

オプション 2 の場合:

$stoparray = [];
foreach ($pdo->query("SELECT * FROM `MyTable`") as $row) {
  $stopkey = $row["stop"];
  if (!array_key_exists($stopkey, $stoparray)) {
    $stoparray[$stopkey] = ["stop"=>$stopkey];
  }
  $waykey = "way_" . $row["way"];
  $stoparray[$stopkey][$waykey] = $row["time"];
}
ログイン後にコピー

以上がMySQL でさまざまな列名を持つクロス集計表を動的に作成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート