Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Existe uma alternativa `connect by` no MySQL?


Como dito nos comentários, não há um caminho curto com o mysql.

MAS!

Se você tiver a possibilidade de alterar a estrutura do banco de dados, poderá implantar um design melhor para lidar com hierarquias semelhantes a árvores.

Se você seguir ESTE TUTORIAL de Bill Karwin (AQUI é a resposta original que faz referência a esse tutorial de apresentação de slides), você pode encontrar 4 métodos usados ​​para modelar uma estrutura hierárquica:
  1. Lista de afiliação
  2. Enumeração de caminho
  3. Conjuntos aninhados
  4. Tabela de fechamento

Agora, o melhor modelo possível é o 4º (deixo descrições dos outros 3 modelos para o leitor), que basicamente precisa de 2 tabelas:uma para os elementos e outra para os caminhos. Na tabela de caminhos (a própria tabela de fechamento), você armazenará todos os caminhos de cada nó para cada descendente (não apenas os filhos diretos!).

Sugere-se salvar também o comprimento do caminho para cada linha, porque facilita a consulta de filhos imediatos na árvore.

Mesmo que esta solução exija mais espaço, ela tem o melhor desempenho geral e é realmente fácil de usar:ela não depende de consultas recursivas E garante integridade referencial para todo o conjunto de dados!

Por exemplo, para obter todos os filhos do nó #4:
select a.*
from nodes a
join paths b
on a.node_id = b.descendant
where b.ancestor = 4

Outro exemplo:obtenha todos os ancestrais do nó #11
select a.*
from nodes a
join paths b
on a.node_id = b.ancestor
where b.descendant = 11

precisa deletar a subárvore do nó #6
delete from paths where descendant in
(select descendant from paths where ancestor = 6)