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