準備されたステートメントを使用した MySQL での動的ピボット
MySQL にはネイティブ PIVOT 関数がありませんが、集計関数と CASE ステートメントを使用してエミュレートできます。データを動的にピボットする場合、プリペアド ステートメントは効率的なソリューションを提供します。
製品パーツのテーブルを使用したシナリオを考えてみましょう。
CREATE TABLE Parts ( part_id INT, part_type VARCHAR(1), product_id INT ); INSERT INTO Parts (part_id, part_type, product_id) VALUES (1, 'A', 1), (2, 'B', 1), (3, 'A', 2), (4, 'B', 2), (5, 'A', 3), (6, 'B', 3);
必要な出力は、各パーツの ID を要約したピボット テーブルです。製品:
product_id part_A_id part_B_id ---------- ---------- ---------- 1 1 2 2 3 4 3 5 6
動的ピボットクエリ
SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT( 'max(case when part_type = ''', part_type, ''' then part_id end) AS part_', part_type, '_id' ) ) INTO @sql FROM Parts; SET @sql = CONCAT('SELECT product_id, ', @sql, ' FROM Parts GROUP BY product_id'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
静的ピボット クエリ (制限された列)
固定数のピボット列を持つ静的クエリの場合:
SELECT product_id, max(CASE WHEN part_type = 'A' THEN part_id END) AS part_A_id, max(CASE WHEN part_type = 'B' THEN part_id END) AS part_B_id FROM Parts GROUP BY product_id;
以上が準備されたステートメントを使用して MySQL でデータを動的にピボットする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。