gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 00:04:27 28 4
gpt4 key购买 nike

我有一个旧的用户信息表(仍在使用中),我无法更改 -

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

我已经浏览了 stackoverflow 上有关将数据透视表功能侵入到 MySQL 的各种答案,并且类似,但没有一个似乎与使用来自同一表的列的唯一行值的变量列名别名的情况相匹配。虽然我睡得很少,所以它们都开始变得有点模糊,提前道歉。

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

我能想到的替代方案是获取该用户 ID 的所有行,并在应用程序本身的 for 循环中处理它们,或者尝试将名称限制为有限数量并使用 sub-SELECT s/JOINs。但是,如果添加新名称,第二个选项并不理想,我必须重新访问此查询。

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

最佳答案

与其他一些 RDBMS 不同,MySQL 在设计上不提供对此类旋转操作的 native 支持(开发人员认为它更适合应用程序的表示层,而不是数据库层)。

如果您绝对必须在 MySQL 中执行此类操作,那么构建一个准备好的语句是可行的方法 - 尽管我可能会使用 MySQL 的 GROUP_CONCAT() ,而不是乱搞 CASE 。功能:

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;

查看 sqlfiddle .

请注意 GROUP_CONCAT() 的结果受 group_concat_max_len 限制变量(默认为 1024 字节:这里不太可能相关,除非您有一些非常长的 name 值)。

关于mysql 选择动态行值作为列名,另一列作为值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24713507/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com