表1:
id | typeid | available|
0 | 1 | 12 |
0 | 2 | 44 |
表2:
typeid | typename |
1 | CL |
2 | ML |
我使用concat
和group_concat
进行查询:
select id,concat(group_concat(typename,available)) as types from table1
join table2 on table2.typeid=table1.typeid
我的结果是:
id | types |
0 | CL12,ML44 |
但我想这样显示:
id | CL | ML |
0 | 12 | 44 |
有没有办法将group_concat
结果拆分为列头?
我想从table2动态获取数据。有些用户可以向table2添加数据。所以硬编码typename是不可能的。
答案 0 :(得分:4)
您应该使用表格旋转。 MySQL中没有PIVOT命令,因此您可以使用此查询 -
SELECT
t1.id,
MAX(IF(t2.typename = 'CL', t1.available, NULL)) AS CL,
MAX(IF(t2.typename = 'ML', t1.available, NULL)) AS ML
FROM table1 t1
JOIN table2 t2
ON t1.typeid = t2.typeid
GROUP BY
t1.id;
MySQL pivot tables (transform rows to columns)
如果可能有多个available
值,请使用GROUP_CONCAT函数而不是MAX。
答案 1 :(得分:0)
试试这个:
SELECT a.id, MAX(IF(b.typename = 'CL', a.available, 0)) CL,
MAX(IF(b.typename = 'ML', a.available, 0)) ML
FROM table1 a
INNER JOIN table2 b ON a.typeid=b.typeid
GROUP BY a.id;
如果要对特定类型的可用列的数据求和,请使用 SUM 功能,否则使用与ii相同的查询。
答案 2 :(得分:0)
只有事先了解所有类型名称才能完成 - 否则,您需要找到另一种方式。在支持从存储过程返回结果集的数据库中,可以使用存储过程完成。但是mysql不支持它。
如果您知道所有类型名称,请按照以下方式构建查询:
SELECT
id,
SUM(IF(typename = 'CL', available, 0)) AS `CL`,
SUM(IF(typename = 'ML', available, 0)) AS `ML`
FROM table1 join table2 on table1.typeid = table2.typeid
GROUP BY id