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複数の値が可能な場合は、MAXの代わりにGROUP_CONCAT関数を使用してください。

于 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 に答える