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