Mysql
 sql >> Datenbank >  >> RDS >> Mysql

mysql wählt dynamische Zeilenwerte als Spaltennamen aus, eine andere Spalte als Wert

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).