За разлика от някои други RDBMS MySQL няма вградена поддръжка за операции от този тип по дизайн (разработчиците смятат, че е по-подходящ за слоя на вашето приложение, а не за база данни).
Ако абсолютно трябва да извършвате такива манипулации в MySQL, изграждането на подготвено изявление е начинът, по който трябва да отидете – макар че вместо да се забърквате с CASE
, вероятно просто бих използвал MySQL GROUP_CONCAT()
функция:
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;
Вижте го на sqlfiddle .
Обърнете внимание, че резултатът от GROUP_CONCAT()
е ограничен от group_concat_max_len
променлива (по подразбиране от 1024 байта:малко вероятно е да е от значение тук, освен ако нямате изключително дълго name
стойности).