mysql выбирает значения динамических строк как имена столбцов, другой столбец как значение

У меня есть устаревшая таблица информации о пользователе (которая все еще активно используется), и я не могу изменить структуру –

id name value ------------------------------ 0 timezone Europe/London 0 language en 0 country 45 0 something x 1 timezone Europe/Paris 1 language fr 1 country 46 

часовой пояс / язык / страна и т. д. являются только примерами имен, они могут быть переменными / нет конечного списка, кроме уникального в строках этого столбца

Мне нужен MySQL-совместимый SQL-запрос, который бы возвращался –

 id timezone language country something --------------------------------------------------- 0 Europe/London en 45 x 1 Europe/Paris fr 46 

Я просмотрел различные ответы на stackoverflow вокруг взлома функции сводной таблицы в MySQL и аналогичен, но ни один из них, похоже, не соответствует этому случаю использования псевдонимов переменной column name из уникальных значений строк из столбца той же таблицы. Хотя у меня был небольшой сон, поэтому они все начинают немного расплываться, извиняясь заранее.

Ближе всего я мог бы найти готовые инструкции https://stackoverflow.com/a/986088/830171, которые сначала получат все возможные / уникальные значения из столбца имени и строят запрос, который использует CASE WHEN и / или несколько подкатегорий, SELECT или JOIN для одних и тех же табличных запросов.

Альтернативами, о которых я могу думать, было бы получить все строки для этого идентификатора пользователя и обработать их в самом приложении в цикле for, или попытаться ограничить имена конечной суммой и использовать sub- SELECT s / JOIN s. Однако этот второй вариант не идеален, если добавлено новое имя, мне придется пересмотреть этот запрос.

Пожалуйста, скажите мне, что я пропустил что-то очевидное

В отличие от некоторых других СУБД MySQL не имеет встроенной поддержки для таких операций разработки такого рода (разработчики считают, что это больше подходит для уровня приложения, а не для базы данных).

Если вы абсолютно должны перенести такие манипуляции в MySQL, создание подготовленного оператора – это путь, но вместо того, чтобы возиться с CASE , я бы просто использовал функцию GROUP_CONCAT() MySQL:

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