MySQL - 如何使用concat和group_concat将行值显示为列名

时间:2012-12-21 06:43:27

标签: mysql select pivot-table group-concat

表1:

id   | typeid | available|
0    | 1      | 12       |
0    | 2      | 44       |

表2:

typeid   | typename   |
1        | CL          |
2        | ML          |

我使用concatgroup_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是不可能的。

3 个答案:

答案 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