Pergunta

Eu tenho uma tabela que é semelhante ao seguinte abaixo:

       id |        cat |         one_above |        top_level | 
        0    'printers'          'hardware'        'computers'

Eu quero ser capaz de escrever uma consulta, sem usar sindicatos , que vai me devolver um conjunto de resultados que transpõe as colunas dessa tabela em fileiras. O que isto significa, é que eu quero que o resultado seja:

       id |          cat |
        0      'printers'
        0      'hardware'
        0     'computers'

Isso é possível no MySQL? Eu não pode cair para a camada de aplicação e executar isso porque eu estou alimentando estes em um motor de busca que o índice vontade com base no id. Vários outros DBMS ter algo como pivô e UNPIVOT. Gostaria muito de receber qualquer insight para algo que eu estou sentindo falta.

Mahmoud

P.S.

Estou pensando em re-normalização do banco de dados como uma última opção, uma vez que esta não será uma tarefa trivial.

Obrigado!

Foi útil?

Solução

Eu tenho esse do livro The Art of SQL, páginas 284-286:

Vamos dizer que seu nome da tabela é foo.

Primeiro, crie uma tabela chamada pivot:

CREATE Table pivot (
  count int
);

Inserir em que as tabelas como muitas linhas como existem colunas que deseja pivot em foo. Desde que você tem três colunas em foo que deseja pivô, criar três linhas na tabela dinâmica:

insert into pivot values (1);
insert into pivot values (2);
insert into pivot values (3);

Agora, uma junção cartesiana entre foo e pivot, usando um CASE para selecionar a coluna correta com base na contagem:

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;

Isso deve lhe dar o que você quer.

Outras dicas

Depois de algumas escavações bastante extensa eu tropecei em esta página que pode ou não pode conter sua resposta. É uma difícil em MySQL mas de um ponto de vista conceitual eu posso construir uma consulta que transpor como esta usando descrever (embora ele provavelmente iria realizar horrivelmente). Então, eu tenho certeza de que podemos descobrir uma maneira de fazê-lo da maneira certa.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top