sql >> Base de Datos >  >> RDS >> Mysql

mysql seleccione valores de fila dinámicos como nombres de columna, otra columna como valor

A diferencia de otros RDBMS, MySQL no tiene soporte nativo para operaciones dinámicas de este tipo por diseño (los desarrolladores creen que es más adecuado para la capa de presentación, en lugar de la base de datos, de su aplicación).

Si es absolutamente necesario realizar tales manipulaciones dentro de MySQL, el camino a seguir es crear una declaración preparada, aunque en lugar de perder el tiempo con CASE , probablemente usaría el GROUP_CONCAT() función:

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;

Véalo en sqlfiddle .

Tenga en cuenta que el resultado de GROUP_CONCAT() está limitado por group_concat_max_len variable (valor predeterminado de 1024 bytes:es poco probable que sea relevante aquí a menos que tenga un name extremadamente largo valores).