当前位置: 首页 > 面试题库 >

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

彭高畅
2023-03-14
问题内容

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

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和/或多个子SELECTJOIN上一个的查询相同的表查询。

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

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


问题答案:

与某些其他RDBMS不同,MySQL不原生支持 按设计 进行此类透视操作(开发人员认为它更适合应用程序的表示层而不是数据库层)。

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

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值,否则此处不太可能相关)。



 类似资料:
  • 问题内容: 这是我的基本表(显示为关联数组): 在另一个名为的表上,我可以添加多个属于一行的自定义数据。像这样: 我目前正在制作,但它只会增加,并给我行。我想要的是我的查询返回如下内容: 行值变成一列,而,它就是值。 我该怎么做? 问题答案: SELECT a.ID, a.Campaign_ID, a.FirstName, a.LastName, MAX(CASE WHEN b.data = ‘q

  • 问题内容: 我有一个带有列名称的数据表: 其中“列”包含数字值,“期间”列是具有1到48的标识列,因此有48行。 我想将此表按摩成一种格式,在该格式中,我具有“名称”列和“值”列以及“期间”列。 我想创建原始表的视图来执行此操作吗?如何选择列名称,并将其以及该列中的正确值放入NameOfVehicle和Value列中? 问题答案: 如果您有固定的列,则始终可以执行以下操作: 如果列是动态的或未知的

  • 问题内容: 我有一个看起来像这样的mysql表: 我希望能够查询得到多行,每一列一个。例如: 这会给我: 我需要用什么来制定这样的查询? 问题答案: 您必须首先将每个指定字段的数据应用于结果。 询问 签 出 SQLFIDDLE

  • 问题内容: 我有一个用于“个人档案”的表,以行样式存储个人档案属性值,例如: 和另一个用于属性定义的表: 如何使用或以任何其他方式以这种方式显示它: 问题答案: 不用关键字就可以轻松完成此操作,只需将其分组即可 您也可以使用关键字执行此操作

  • 问题内容: 在MSSQL服务器上,给出以下表: 我可以发出类似的查询: 并得到类似: 如果我想要这样的数据,查询数据库的最有效方法是什么? 数据库结构要复杂得多,不幸的是我无法更改它。 编辑 :解决方案不应在查询中使用和作为硬编码值。 问题答案: 对于SQL Server 2005+,可以使用动态SQL和。

  • 问题内容: 我在C#方面非常有经验,但是仍然还是SQL的初学者。 我们有一个使用MSSQL数据库的C#应用​​程序。 我们的应用程序的一部分只是简单地编写一系列预查询,作为报告,通过简单地运行查询并将返回的表粘贴到gridView即可显示该报告。用户正在请求一个新的报表,我不能完全确定仅使用SQL还是可以的,并且需要对返回的数据进行处理才能使其看起来正确。 用户想要的数据(以他们希望的方式呈现)将