mysql - 如何将(?)表字段转置为mysql View 中的列标题?

标签 mysql

我有这个 EAV 方法:

Forms_data [id | form_id | survey_id | key  | value ]
           [1  | 1       | 1         | q1   |  Male ]
           [2  | 1       | 1         | q2   | 1/1/76]
           [3  | 2       | 1         | Car  |  Honda]
           [4  | 2       | 1         | Eng  | Petrol]
           [5  | 1       | 2         | q1   |  Fem  ]
           [6  | 1       | 2         | q2   | 2/3/81]
           [7  | 2       | 2         | Car  |  Ford ]
           [8  | 2       | 2         | Eng  | Diesel]

我想创建 View ,例如:

查看表单 ID 1:

[survey_id  |  q1   | q2     ]
[ 1         |  Male | 1/1/76 ] 
[ 2         |  Fem  | 2/3/81 ]

查看表单 ID 2:

[survey_id  |  car   | eng     ]
[ 1         |  Honda | Petrol  ] 
[ 2         |  Ford  | Diesel  ]

我该如何在 MySQL 中执行此操作?

最佳答案

不幸的是,MySQL 没有 PIVOT 函数将数据行转换为列,但您可以使用带有 CASE 表达式的聚合函数来获取结果。

如果您提前知道key值,那么您可以对查询进行硬编码:

select survey_id,
  max(case when `key`='q1' then value end) q1,
  max(case when `key`='q2' then value end) q2
from yt
where form_id = 1
group by survey_id;

select survey_id,
  max(case when `key`='car' then value end) car,
  max(case when `key`='eng' then value end) eng
from yt
where form_id = 2
group by survey_id;

参见SQL Fiddle with Demo .

但是如果您希望结果是动态的,那么您将需要使用准备好的语句来获取结果:

SET @sql = NULL;
SET @form_id = 1;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(CASE WHEN `key` = ''',
      `key`,
      ''' THEN value END) AS `',
      `key`, '`'
    )
  ) INTO @sql
FROM yt
where form_id = @form_id;

SET @sql 
  = CONCAT('SELECT survey_id, ', @sql, ' 
            from yt
            where form_id = ', @form_id, '
            group by survey_id');


PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

参见SQL Fiddle with Demo

关于mysql - 如何将(?)表字段转置为mysql View 中的列标题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17173218/

相关文章:

mysql - MySQL表中的列可以用数字来命名吗?

mysql - 如何为具有 FK 关系的表创建插入脚本

mysql - Grails 数据库逆向工程失败

mysql - 时间计算(到下一个时段的回合时间)

php - 数据库;案件;多个何时?然后 ?。如何创建数据?与 foreach

c# - 我想从 mysql 数据库检索图像,但出现错误 "system parameter is not valid at system drawing image fromstream... "

mysql - SQL查询 "like"运算符错误,当字段为空时

python - 使用 MySQL 管理 Web 应用程序的用户身份验证

php - 项目不会插入到 SQL 表 android 的末尾

php - 如何禁用 php/mysql 用户帐户