MySQL を使用して動的行値を列名に変換します
固定構造の従来のテーブルでは、ピボット形式でデータを取得するのが難しい場合があります。 MySQL にはネイティブのピボット機能がないため、この問題を解決するにはプリペアド ステートメントを使用する必要があります。
次の従来のテーブルについて考えてみましょう:
<code>id name value ------------------------------ 0 timezone Europe/London 0 language en 0 country 45 0 something x 1 timezone Europe/Paris 1 language fr 1 country 46</code>
動的行値を列名として使用した目的の出力:
<code>id timezone language country something --------------------------------------------------- 0 Europe/London en 45 x 1 Europe/Paris fr 46</code>
他の RDBMS とは異なり、MySQL は間接的なアプローチを必要とします。プリペアドステートメントを構築することをお勧めします。
<code class="language-sql">SELECT CONCAT( 'SELECT `table`.id', GROUP_CONCAT(' , `t_', REPLACE(name, '`', '``'), '`.value AS `', REPLACE(name, '`', '``'), '`' SEPARATOR ''), ' FROM `table` ', GROUP_CONCAT(' LEFT JOIN `table` AS `t_', REPLACE(name, '`', '``'), '` ON `table`.id = `t_', REPLACE(name, '`', '``'), '`.id AND `t_', REPLACE(name, '`', '``'), '`.name = ', QUOTE(name) SEPARATOR ''), ' GROUP BY `table`.id' ) INTO @qry FROM (SELECT DISTINCT name FROM `table`) t; PREPARE stmt FROM @qry; EXECUTE stmt;</code>
このクエリは、GROUP_CONCAT()
を使用して動的 SQL ステートメントを構築し、必要な JOIN と列の別名を接続します。生成された SQL ステートメントは準備されて実行されます。
このアプローチにより、ハードコーディングされた副選択や CASE ステートメントを必要とせずに、一意の行値を変数列名として使用できます。より多くのセットアップが必要になる場合がありますが、MySQL でデータをピボットするためのより柔軟で効率的なソリューションが提供されます。
以上がMySQL で動的な行の値を列名にピボットする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。