A differenza di altri RDBMS, MySQL non ha il supporto nativo per operazioni pivot di questo tipo in base alla progettazione (gli sviluppatori ritengono che sia più adatto alla presentazione, piuttosto che al database, al livello della tua applicazione).
Se devi assolutamente eseguire tali manipolazioni all'interno di MySQL, costruire una dichiarazione preparata è la strada da percorrere, anche se piuttosto che scherzare con CASE
, probabilmente userei solo GROUP_CONCAT()
funzione:
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;
Guardalo su sqlfiddle .
Nota che il risultato di GROUP_CONCAT()
è limitato da group_concat_max_len
variabile (predefinito di 1024 byte:improbabile che sia rilevante qui a meno che tu non abbia un name
estremamente lungo valori).