我的网页中有一项调查,其中包含从 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/