MySQL は行データから列データへの変換をサポートしており、必要に応じて新しい列を動的に追加できます。このプロセスは多くの場合、データをよりユーザーフレンドリーな表形式で表示するピボット テーブルに関連付けられます。この変換を実現するには、GROUP BY
関数と MAX
関数を使用できます。
以下はテーブル A とテーブル B を含む例です:
<code>表 A +--+-----+----+ |id|order|data| +--+-----+----+ |1 |1 |P | +--+-----+----+ |2 |2 |Q | +--+-----+----+ |2 |1 |R | +--+-----+----+ |1 |2 |S | +--+-----+----+ 表 B +--+----+----+ |id|name|value| +--+----+----+ |1 |name1|data1| +--+----+----+ |1 |name2|data2| +--+----+----+ |2 |name1|data3| +--+----+----+ |2 |name2|data4| +--+----+----+</code>
このデータ構造を行と列を含むテーブルに変換するには、次のクエリを使用できます:
<code class="language-sql">SELECT ID, MAX(IF(`order` = 1, data, NULL)) AS data1, MAX(IF(`order` = 2, data, NULL)) AS data2 FROM TableA GROUP BY ID</code>
このクエリの出力は次のようになります:
<code>+--+-----+-----+ |id|data1|data2| +--+-----+-----+ |1 |P |S | +--+-----+-----+ |2 |R |Q | +--+-----+-----+</code>
ご覧のとおり、テーブル B の各行は、結果のテーブルの列に変換されています。
データに同じ「順序」フィールドに複数の値が含まれている場合は、動的 SQL を組み合わせて変換をより効率的に処理できます。この方法では、「order」フィールドのさまざまな値に基づいてクエリを動的に生成します:
<code class="language-sql">SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT( 'MAX(IF(`order` = ', `order`, ',data,NULL)) AS data', `order`) ) INTO @sql FROM TableName; SET @sql = CONCAT('SELECT ID, ', @sql, ' FROM TableName GROUP BY ID'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;</code>
この動的 SQL アプローチの利点は、新しい値が「order」フィールドに追加されるたびにクエリを手動で変更する必要がないことです。
以上がMySQL で行を列に動的に変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。