使用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中文網其他相關文章!