Till skillnad från vissa andra RDBMS har MySQL inte inbyggt stöd för pivoteringsoperationer av det här slaget efter design (Utvecklarna tycker att det är mer lämpat för presentationen, snarare än databaslagret i din applikation).
Om du absolut måste utföra sådana manipulationer inom MySQL, är att bygga ett förberett uttalande vägen att gå – även om det snarare än att bråka med CASE
, jag skulle förmodligen bara använda MySQL:s GROUP_CONCAT()
funktion:
SELECT CONCAT(
'SELECT `table`.id', GROUP_CONCAT('
, `t_', REPLACE(name, '`', '``'), '`.value
AS `', REPLACE(name, '`', '``'), '`'
SEPARATOR ''),
' FROM `table` ', GROUP_CONCAT('
LEFT JOIN `table` AS `t_', REPLACE(name, '`', '``'), '`
ON `table`.id = `t_', REPLACE(name, '`', '``'), '`.id
AND `t_', REPLACE(name, '`', '``'), '`.name = ', QUOTE(name)
SEPARATOR ''),
' GROUP BY `table`.id'
) INTO @qry FROM (SELECT DISTINCT name FROM `table`) t;
PREPARE stmt FROM @qry;
EXECUTE stmt;
Se den på sqlfiddle .
Observera att resultatet av GROUP_CONCAT()
begränsas av group_concat_max_len
variabel (standard på 1024 byte:är osannolikt relevant här om du inte har något extremt långt namn
värden).