Транспонировать строку в столбцы с помощью MySQL без использования ОБЪЕДИНЕНИЙ?
Вопрос
У меня есть таблица, похожая на приведенную ниже:
id | cat | one_above | top_level |
0 'printers' 'hardware' 'computers'
Я хочу иметь возможность написать запрос, без использования союзов, это вернет мне результирующий набор, который преобразует столбцы этой таблицы в строки.Это означает, что я хочу, чтобы результат был:
id | cat |
0 'printers'
0 'hardware'
0 'computers'
Возможно ли это в MySQL?Я не могу перейти на уровень приложения и выполнить это, потому что я загружаю их в поисковую систему, которая будет индексировать на основе идентификатора.Различные другие СУБД имеют что-то вроде PIVOT и UNPIVOT.Я был бы признателен за любое понимание того, чего мне не хватает.
Махмуд
P.S.
Я рассматриваю повторную нормализацию базы данных в качестве последнего варианта, поскольку это не будет тривиальной задачей.
Спасибо!
Решение
Я взял это из книги Искусство SQL, страницы 284-286:
Допустим, имя вашей таблицы таково foo
.
Сначала создайте таблицу под названием pivot
:
CREATE Table pivot (
count int
);
Вставьте в эти таблицы столько строк, сколько есть столбцов, в которых вы хотите выполнить поворот foo
.Поскольку у вас есть три столбца в foo
которые вы хотите свести, создайте три строки в сводной таблице:
insert into pivot values (1);
insert into pivot values (2);
insert into pivot values (3);
Теперь выполните декартово соединение между foo
и pivot
, используя CASE
чтобы выбрать правильный столбец на основе количества:
SELECT foo.id, Case pivot.count
When 1 Then cat
When 2 Then one_above
When 3 Then top_level
End Case
FROM foo JOIN pivot;
Это должно дать вам то, что вы хотите.
Другие советы
После довольно обширных раскопок я наткнулся на эта страница который может содержать, а может и не содержать ваш ответ.В MySQL это сложно, но с концептуальной точки зрения я могу сконструировать запрос, который бы транспонировался подобным образом, используя describe (хотя, вероятно, он выполнялся бы ужасно).Поэтому я уверен, что мы сможем найти способ сделать это правильно.