Транспонировать строку в столбцы с помощью MySQL без использования ОБЪЕДИНЕНИЙ?

StackOverflow https://stackoverflow.com/questions/1851781

  •  13-09-2019
  •  | 
  •  

Вопрос

У меня есть таблица, похожая на приведенную ниже:

       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 (хотя, вероятно, он выполнялся бы ужасно).Поэтому я уверен, что мы сможем найти способ сделать это правильно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top