开发者社区> 问答> 正文

mysql选择动态行值作为列名,另一列作为值

我有一个旧的用户信息表(仍在使用中),并且不能更改-

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 时区/语言/国家等只是名称的示例,它们可以是可变的/除了该列的行上的唯一列表外,没有其他任何有限列表

我需要一个MySQL兼容的SQL查询,该查询将返回-

id timezone language country something

0 Europe/London en 45 x 1 Europe/Paris fr 46 我已经研究了关于将数据透视表功能窃取到MySQL的关于stackoverflow的各种答案,类似的方法,但是似乎没有一个比从相同表的列的唯一行值使用变量列名别名的情况更好。尽管我几乎没有睡觉,所以他们都开始变得有点模糊,但要提前道歉。

我能找到的最接近的是使用准备好的语句https://stackoverflow.com/a/986088/830171,该语句首先会从名称列中获取所有可能的/唯一的值,并建立一个使用CASE WHEN和/或多个子SELECT或JOIN上一个的查询相同的表查询。

我可以想到的替代方法是获取该用户ID的所有行,并在应用程序本身中以for循环方式处理它们,或尝试将名称限制为有限数量并使用subs SELECT/ JOINs。但是,如果添加了新名称,则第二个选项并不理想,我将不得不重新访问该查询。

请告诉我我错过了明显的事情

展开
收起
保持可爱mmm 2020-05-11 11:57:49 741 0
1 条回答
写回答
取消 提交回答
  • "与某些其他RDBMS不同,MySQL不原生支持按设计进行此类透视操作(开发人员认为它更适合应用程序的表示层而不是数据库层)。

    如果您绝对必须在MySQL中执行此类操作,则构建一条准备好的语句是正确的方法-尽管与其乱七八糟CASE,我可能只是使用MySQL的GROUP_CONCAT()函数:

    SELECT CONCAT( 'SELECT table.id', GROUP_CONCAT(' , t_', REPLACE(name, '', ''), '`.value AS `', REPLACE(name, '`', ''), '' SEPARATOR ''), ' FROMtable', GROUP_CONCAT(' LEFT JOINtableASt_', REPLACE(name, '', '``'), ' ON table.id = t_', REPLACE(name, '', ''), '`.id AND `t_', REPLACE(name, '`', ''), '.name = ', QUOTE(name) SEPARATOR ''), ' GROUP BYtable.id' ) INTO @qry FROM (SELECT DISTINCT name FROMtable`) t;

    PREPARE stmt FROM @qry; EXECUTE stmt; 在sqlfiddle上看到它。

    请注意,的结果GROUP_CONCAT()受group_concat_max_len变量限制(默认为1024字节:除非您有一些非常长的name值,否则此处不太可能相关)。" 来源:stack overflow

    2020-05-11 16:11:38
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
One Box: 解读事务与分析一体化数据库 HybridDB for MySQL 立即下载
One Box:解读事务与分析一体化数据库HybridDB for MySQL 立即下载
如何支撑HTAP场景-HybridDB for MySQL系统架构和技术演进 立即下载

相关镜像