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 ...
fonte
O design desta tabela é um "antipadrão" SQL antipadrão, conforme descrito por Bill Karwin (a partir do slide 48 em sua apresentação Strike Back do Antipatterns SQL ). O problema desse design especificamente é a dificuldade de obter todos os descendentes (ou pais) de um nó. Como você está usando o MySQL, não é possível usar expressões de tabela comuns (a instrução WITH e seu modificador RECURSIVE) presentes em outros RDBMSes.
O que resta é:
crie consultas de associação automática com um limite de profundidade. Para profundidade = 5, você pode 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)
fonte
O MySQL não suporta consultas recursivas como a que você precisa.
O que fiz um tempo atrás foi escrever Procedimentos armazenados que fornecem o modelo para isso.
Em vez de reinventar a roda, darei a você 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 Procedimentos armazenados que fiz para fazer o percurso da árvore de pré-encomenda usando o processamento da fila
GetParentIDByID
GetAncestry
GetFamilyTree
Pai de todos os filhos (como o procedimento armazenado GetFamilyTree)
parent_id
em uma filaparent_id
como o atualid
valores que possuem a correnteparent_id
STEP02
Filho de todos os pais (como o GetAncestry Stored Procedure)
id
em uma filaid
como o atualparent_id
valor da corrente na filaid
STEP02
Consulte os procedimentos armazenados em meus outros posts para ver a implementação.
De uma chance !!!
fonte
violino
fonte