Tengo una comments
tabla, que se puede simplificar a esto:
comments
=======
id
user_id
text
parent_id
donde parent_id
es anulable, pero podría ser una clave para su comentario principal.
Ahora, ¿cómo puedo select
todos los descendientes de un comentario específico?
Los comentarios pueden estar varios niveles abajo ...
fuente
Este diseño de tabla es un "árbol ingenuo" antipatrón de SQL como lo describe Bill Karwin (mirando desde la diapositiva 48 en su presentación SQL Antipatterns Strike Back ). El problema con este diseño específicamente es la dificultad de obtener todos los descendientes (o padres) de un nodo. Como está utilizando MySQL, no puede usar expresiones de tabla comunes (la instrucción WITH y su modificador RECURSIVE) presente en otros RDBMS.
Lo que te queda es:
Construir consultas de autounión con un límite de profundidad. Para profundidad = 5 podría usar algo en las líneas de:
use un RDBMS que admita WITH RECURSIVE (aunque esto probablemente no sea una opción para la mayoría de las personas)
fuente
MySQL no admite consultas recursivas como la que necesita.
Lo que hice hace un tiempo fue escribir Procedimientos almacenados que proporcionan el modelo para hacerlo.
En lugar de reinventar la rueda, te daré los enlaces a mis publicaciones anteriores sobre esto:
Oct 24, 2011
: Encuentra el nivel más alto de un campo jerárquico: con vs sin CTEDec 10, 2012
: MySQL: consulta jerárquica en árbolApr 12, 2013
: Consulta recursiva en mysqlEn resumen, los Procedimientos almacenados que realicé preordenan el recorrido del árbol mediante procesamiento de cola
GetParentIDByID
GetAncestry
GetFamilyTree
Padres de todos los niños (como Procedimiento almacenado GetFamilyTree)
parent_id
en una colaparent_id
como el actualid
valores que tienen la corrienteparent_id
STEP02
Hijo a todos los padres (como Procedimiento almacenado GetAncestry)
id
en una colaid
como el actualparent_id
valor de la corrienteid
STEP02
Consulte los procedimientos almacenados en mis otras publicaciones para ver la implementación.
Darle una oportunidad !!!
fuente
violín
fuente