2012-12-21 46 views
2

表1:MySQL的 - 如何使用CONCAT及GROUP_CONCAT顯示行值作爲列名

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結果拆分列頭

我想動態地從表2中獲取數據。某些用戶可以將數據添加到table2。所以硬編碼類型名稱是不可能的。

回答

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。如果你想從particualr類型其他使用相同的查詢作爲II可列彙總數據的

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功能:

+0

但現在的挑戰:怎麼樣,如果你不知道類型名值?那麼是否可以呢? – JosFabre

0

試試這個。

0

只有您事先知道所有類型名稱,才能完成此操作 - 否則,您需要尋找其他方法。在支持存儲過程返回結果集的數據庫中,可以使用存儲過程完成。但是mysql不支持。

如果你知道所有的typenames,這裏是你如何構建查詢:

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