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