一个菜鸟MYSQL用户....我有一个简单的MySQL查询,该查询返回值,并使用GROUP_CONCAT函数:
SELECT Productid, Name, GROUP_CONCAT(value) FROM search_export Group By Productid, Name; Productid Name GROUP_CONCAT(value) 666056542 Brand Name Netgear 1054677552 Ethernet Technology Gigabit Ethernet 665655662 Form Factor Wall Mountable,Desktop 56565765 Media Type Supported Twisted Pair
但是,我需要转置查询,以便它以单独的列而不是行的形式返回“名称”。MySQL完全有可能吗?
您需要执行一项PIVOT操作,MySQL本身不支持该操作(与某些其他RDBMS不同)。
PIVOT
您可以获得的最接近的结果是按照以下几行构造SQL:
SELECT ProductId, GROUP_CONCAT(IF(Name='Brand Name' ,value,NULL)) AS `Brand Name`, GROUP_CONCAT(IF(Name='Ethernet Technology' ,value,NULL)) AS `Ethernet Technology`, GROUP_CONCAT(IF(Name='Form Factor' ,value,NULL)) AS `Form Factor`, GROUP_CONCAT(IF(Name='Media Type Supported',value,NULL)) AS `Media Type Supported` FROM search_export GROUP BY ProductId
如果可能的Name值是动态的,则可以从以下结果中以更高级的语言生成此类SQL:
Name
SELECT DISTINCT Name FROM search_export
确实,甚至可以使用SQL本身:
SELECT CONCAT(' SELECT ProductId, ', GROUP_CONCAT(' GROUP_CONCAT(IF(Name=',QUOTE(Name),',value,NULL)) AS `',REPLACE(Name,'`','``'),'`' ), ' FROM search_export GROUP BY ProductId ') INTO @sql FROM ( SELECT DISTINCT Name FROM search_export ) t; PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
请注意,如果有很多不同的Name值,则可能需要增加group_concat_max_len其默认值1KiB。
group_concat_max_len