2

表格1:

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

表 2:

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

我有一个使用concatand的查询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。所以硬编码类型名是不可能的。

4

3 回答 3

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 数据透视表(将行转换为列)

available如果可能有多个值,请使用 GROUP_CONCAT 函数而不是 MAX 。

于 2012-12-21T07:00:08.060 回答
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 相同的查询。

于 2012-12-21T07:01:15.107 回答
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
于 2012-12-21T07:02:09.427 回答