mysql - 如何更改查询中行的列

标签 mysql sql

我的网页中有一项调查,其中包含从 1 到 5 的许多评估目标。我将调查发送到调查表中的数据库。 例如

 obj1value | obj2value | obj3value ...  | obj17value |

我对每项调查都有值(value)。

现在我需要做一些图表来呈现调查报告。 我需要将每个目标的总数相加。 我有这个查询

SELECT SUM(obj1_value) AS objective1, SUM(obj2_value) AS objective2, SUM(obj3_value) AS objective3, FROM tbl_survey

我一直到 Objective17 为止,并且查询返回

| objective1 | objective2 | objective3 | 
|   ---      |    ---     |    ---     |
|    17      |     12     |    5       |

但是我需要像这样更改查询

_objective_ | _Value_           
objective1  | 17 
objective2  | 12 
objective3  | 5  
Objective17 |  n

有人可以帮助我优化查询,因为通过这种方式我可以将表 php 转换为 json 并轻松获取条形图库。
谢谢

最佳答案

在 PHP 中进行转换可能是最简单的。 MySQL 中的一种方法是简单的 UNION ALL:

SELECT 'obj1_value', SUM(obj1_value) 
FROM tbl_survey
UNION ALL
SELECT 'obj2_value', SUM(obj2_value) 
FROM tbl_survey
UNION ALL
. . .

这种方法的缺点是表被扫描 17 次,因此可能需要大约 17 倍的时间。

您可以通过执行逆透视来提高性能。 MySQL 中的一种方法如下:

SELECT o.obj,
       (CASE WHEN obj = 'objective1' THEN objective1
             WHEN obj = 'objective2' THEN objective2
             . . .
        END) as value
FROM (SELECT SUM(obj1_value) AS objective1, SUM(obj2_value) AS objective2, 
             SUM(obj3_value) AS objective3, . . .
      FROM tbl_survey
     ) s CROSS JOIN
     (SELECT 'objective1' as obj UNION ALL
      SELECT 'objective2' as obj UNION ALL
      . . .
     ) o;

关于mysql - 如何更改查询中行的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46162131/

相关文章:

mysql 慢日志查询

php - 拉维尔 5.4 : Directly Subtract number from column in database

php - 如何将查询与sql中的表进行比较

mysql - 跨 6 个表查询,是否有更好的方法?

c# - 我有一个表,它有一个由三列组成的主键。我如何索引这个表?

mysql - 将现有的自动增量 ID 排序的代码可能是什么?

mysql - 跟踪用户之间在对象上的交互

mysql - 查找类型 B 和 C 之间发生的所有类型 A 的日志事件

php - 无法在 AWS LAMP 服务器上运行 PhP artisan migrate

php - 50 次循环后需要停止 while 循环