Eu tenho uma comments
tabela, que pode ser simplificada para isso:
comments
=======
id
user_id
text
parent_id
onde parent_id
é anulável, mas pode ser uma chave para seu comentário pai.
Agora, como posso select
todos os descendentes de um comentário específico?
Os comentários podem estar vários níveis abaixo...
As consultas hierárquicas , como essas consultas recursivas são conhecidas, agora são suportadas no MySQL 8 .
Resposta antiga
Alternativamente, você pode encontrar um truque dinâmico (e, portanto, potencialmente perigoso) aqui: https://stackoverflow.com/questions/8104187/mysql-hierarchical-queries
Você também pode encontrar uma discussão sobre como armazenar dados hierárquicos com outros modelos além de uma Lista de Adjacência (ou seja, a coluna Pai ) aqui: https://stackoverflow.com/questions/192220/what-is-the-most-efficient- maneira elegante de analisar uma mesa plana em uma árvore/
Boa sorte!
Esse design de tabela é um antipadrão SQL "Árvores ingênuas", conforme descrito por Bill Karwin (a partir do slide 48 em sua apresentação SQL Antipatterns Strike Back ). O problema com esse design especificamente é a dificuldade de obter todos os descendentes (ou pais) de um nó. Como você está usando o MySQL, você não pode usar expressões de tabela comuns (a instrução WITH e seu modificador RECURSIVE) presentes em outros RDBMSes.
O que resta é:
construir consultas de autojunção com um limite de profundidade. Para profundidade = 5 você poderia usar algo nas linhas de:
use um RDBMS que suporte WITH RECURSIVE (embora isso provavelmente não seja uma opção para a maioria das pessoas)
O MySQL não suporta consultas recursivas como a que você precisa.
O que eu fiz um tempo atrás foi escrever procedimentos armazenados que fornecem o modelo para fazer isso.
Em vez de reinventar a roda, darei os links para meus posts anteriores sobre isso:
Oct 24, 2011
: Encontre o nível mais alto de um campo hierárquico: com vs sem CTEsDec 10, 2012
: MySQL: consulta hierárquica em árvoreApr 12, 2013
: Consulta recursiva no mysqlResumindo, os Stored Procedures que fiz fazem travessia de árvore de pré-ordem usando processamento de fila
GetParentIDByID
GetAncestry
GetFamilyTree
Pai para todos os filhos (como o procedimento armazenado GetFamilyTree)
parent_id
em uma filaparent_id
como o atualid
valores que têm o valor atualparent_id
STEP02
Filho para todos os pais (como o procedimento armazenado GetAncestry)
id
em uma filaid
como o atualparent_id
valor da correnteid
STEP02
Por favor, olhe os procedimentos armazenados em meus outros posts para ver a implementação.
De uma chance !!!
violino