MySQL動態行值作為列名
對於將動態行值作為列名並以透視表格式顯示的舊表數據,MySQL 缺乏原生透視功能。但是,使用GROUP_CONCAT()
的預處理語句可以幫助實現所需結果。
範例表:
<code class="language-sql">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>
建立預處理語句如下:
<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>
此查詢動態產生一個SELECT
語句,使用LEFT JOIN
組合具有相同id
值的各行,提取唯一name
值的對應值。再依id
分組結果,產生所需的透視表格式。
儘管MySQL缺乏原生的透視功能,但此方法提供了一種以結構化方式從具有動態列名的舊表中檢索資料的方法。
以上是如何根據行值透視具有動態列名的 MySQL 表?的詳細內容。更多資訊請關注PHP中文網其他相關文章!