Mysql
 sql >> Base de données >  >> RDS >> Mysql

mysql sélectionne les valeurs de ligne dynamiques comme noms de colonne, une autre colonne comme valeur

Contrairement à certains autres SGBDR, MySQL n'a pas de support natif pour les opérations de pivotement de ce type par conception (les développeurs estiment qu'il est plus adapté à la présentation, plutôt qu'à la couche de base de données, de votre application).

Si vous devez absolument effectuer de telles manipulations dans MySQL, la construction d'une instruction préparée est la voie à suivre, bien que plutôt que de jouer avec CASE , j'utiliserais probablement le GROUP_CONCAT() fonction :

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;

Voir sur sqlfiddle .

Notez que le résultat de GROUP_CONCAT() est limité par le group_concat_max_len variable (par défaut de 1024 octets :peu susceptible d'être pertinente ici, sauf si vous avez un name extrêmement long valeurs).