Na rozdíl od některých jiných RDBMS MySQL nemá nativní podporu pro pivotní operace tohoto druhu by design (vývojáři se domnívají, že je vhodnější pro prezentační, spíše než databázovou vrstvu vaší aplikace).
Pokud bezpodmínečně musíte provádět takové manipulace v rámci MySQL, je cesta k vytvoření připraveného příkazu – i když spíše než si pohrávat s CASE
, pravděpodobně bych použil pouze MySQL GROUP_CONCAT()
funkce:
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;
Podívejte se na sqlfiddle .
Všimněte si, že výsledek GROUP_CONCAT()
je omezena group_concat_max_len
proměnná (výchozí 1024 bajtů:zde pravděpodobně nebude relevantní, pokud nemáte nějaké extrémně dlouhé name
hodnoty).