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>
MySQL 不支援原生透視操作,因此我們需要找到一種變通方法。
解:
GROUP_CONCAT()
函數可用來動態產生建立所需表格式的查詢。 GROUP_CONCAT()
建構最終查詢。 PREPARE
和 EXECUTE
來執行動態產生的查詢。 查詢:
<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()
結果的長度受 group_concat_max_len
變數(預設為 1024 位元組)限制。 CASE WHEN
或多個子選擇/連接的預處理語句,但這需要手動處理唯一列值。 以上是如何根據行值透視具有動態列名的 MySQL 表?的詳細內容。更多資訊請關注PHP中文網其他相關文章!