使用MySQL重塑数据
我有一张这样构造的桌子:使用MySQL重塑数据,mysql,pivot,Mysql,Pivot,我有一张这样构造的桌子: +----+---------+---------+----+----+ | id | filter1 | filter2 | q1 | q2 | +----+---------+---------+----+----+ | 1 | america | y | 1 | 2 | | 2 | asia | y | 4 | 3 | +----+---------+---------+----+----+ 我需要的是在同一标题下,以q
+----+---------+---------+----+----+
| id | filter1 | filter2 | q1 | q2 |
+----+---------+---------+----+----+
| 1 | america | y | 1 | 2 |
| 2 | asia | y | 4 | 3 |
+----+---------+---------+----+----+
我需要的是在同一标题下,以q1和q2为轴心(?)问题
,并在名为答案
最后一张表如下所示:
+----+---------+---------+----------+--------+
| id | filter1 | filter2 | question | answer |
+----+---------+---------+----------+--------+
| 1 | america | y | q1 | 1 |
| 1 | america | y | q2 | 2 |
| 2 | asia | y | q1 | 4 |
| 2 | asia | y | q2 | 3 |
+----+---------+---------+----------+--------+
最简单的方法是使用
union all
:
select id, filter1, filter2, 'q1' as question, q1 as answer
from table t
union all
select id, filter1, filter2, 'q2' as question, q2 as answer
from table t;
如果您有非常大的表或更多的问题,那么这可能不是最有效的方法
编辑:
对于大型表,这可能更有效:
select id, filter1, filter2,
(case when n.n = 1 then 'q1' else 'q2' end) as question,
(case when n.n = 1 then q1 else q2 end) as answer
from table t cross join
(select 1 as n union all select 2 as n) n;
这应该只对表执行一次完整的表扫描,而不是对union all
中的每个子查询执行一次