Im Gegensatz zu einigen anderen RDBMS hat MySQL keine native Unterstützung für Pivot-Operationen dieser Art von Design (Die Entwickler sind der Meinung, dass es eher für die Präsentation als für die Datenbankschicht Ihrer Anwendung geeignet ist).
Wenn Sie solche Manipulationen unbedingt innerhalb von MySQL durchführen müssen, ist das Erstellen einer vorbereiteten Anweisung der richtige Weg – allerdings anstatt mit CASE
herumzuspielen , würde ich wahrscheinlich nur MySQLs 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;
Sehen Sie es auf sqlfiddle .
Beachten Sie, dass das Ergebnis von GROUP_CONCAT()
wird durch group_concat_max_len
begrenzt
Variable (Standardwert von 1024 Bytes:hier wahrscheinlich nicht relevant, es sei denn, Sie haben einen extrem langen name
Werte).