SUB-ÁRBOL DENTRO DE UN ÁRBOL en MySQL
En mi MYSQL Database COMPANY, tengo una Table: Employeeasociación recursiva, un empleado puede ser jefe de otro empleado. A self relationship of kind (SuperVisor (1)- SuperVisee (∞) ).   
Consulta para crear tabla:
CREATE TABLE IF NOT EXISTS `Employee` (
  `SSN` varchar(64) NOT NULL,
  `Name` varchar(64) DEFAULT NULL,
  `Designation` varchar(128) NOT NULL,
  `MSSN` varchar(64) NOT NULL, 
  PRIMARY KEY (`SSN`),
  CONSTRAINT `FK_Manager_Employee`  
              FOREIGN KEY (`MSSN`) REFERENCES Employee(SSN)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
He insertado un conjunto de tuplas (consulta):
INSERT INTO Employee VALUES 
 ("1", "A", "OWNER",  "1"),  
 ("2", "B", "BOSS",   "1"), # Employees under OWNER 
 ("3", "F", "BOSS",   "1"),
 ("4", "C", "BOSS",   "2"), # Employees under B
 ("5", "H", "BOSS",   "2"), 
 ("6", "L", "WORKER", "2"), 
 ("7", "I", "BOSS",   "2"), 
 # Remaining Leaf nodes   
 ("8", "K", "WORKER", "3"), # Employee under F     
 ("9", "J", "WORKER", "7"), # Employee under I     
 ("10","G", "WORKER", "5"), # Employee under H
 ("11","D", "WORKER", "4"), # Employee under C
 ("12","E", "WORKER", "4")  
Las filas insertadas tienen la siguiente relación árbol-jerárquica :
         A     <---ROOT-OWNER
        /|\             
       / A \        
      B     F 
    //| \    \          
   // |  \    K     
  / | |   \                     
 I  L H    C        
/     |   / \ 
J     G  D   E
Escribí una consulta para encontrar una relación:
SELECT  SUPERVISOR.name AS SuperVisor, 
        GROUP_CONCAT(SUPERVISEE.name  ORDER BY SUPERVISEE.name ) AS SuperVisee, 
        COUNT(*)  
FROM Employee AS SUPERVISOR 
  INNER JOIN Employee SUPERVISEE ON  SUPERVISOR.SSN = SUPERVISEE.MSSN 
GROUP BY SuperVisor;
Y la salida es:
+------------+------------+----------+
| SuperVisor | SuperVisee | COUNT(*) |
+------------+------------+----------+
| A          | A,B,F      |        3 |
| B          | C,H,I,L    |        4 |
| C          | D,E        |        2 |
| F          | K          |        1 |
| H          | G          |        1 |
| I          | J          |        1 |
+------------+------------+----------+
6 rows in set (0.00 sec)
[ PREGUNTA ] 
En lugar de completar el árbol jerárquico, necesito un SUB-TREEdesde un punto (selectivo), por ejemplo: 
si el argumento de entrada es, Bentonces la salida debería ser la siguiente ...
+------------+------------+----------+
| SuperVisor | SuperVisee | COUNT(*) |
+------------+------------+----------+
| B          | C,H,I,L    |        4 |
| C          | D,E        |        2 |
| H          | G          |        1 |
| I          | J          |        1 |
+------------+------------+----------+   
Por favor ayúdame con esto. Si no se consulta, un procedimiento almacenado puede ser útil. 
Lo intenté, ¡pero todos los esfuerzos fueron inútiles!
                    
                        mysql
                                stored-procedures
                                
                    
                    
                        Grijesh Chauhan
fuente
                
                fuente

It my experienceSiempre recibí una mejor respuesta por parte de expertos . Y creo que fue una mejor decisión trasladar la pregunta a los administradores de bases de datos. En todos los casos, estoy muy agradecido con stackoverflow y las personas que están activas aquí. Realmente obtuve una solución para muchos problemas que fueron muy difíciles de encontrar o de cualquier otra web.Respuestas:
Ya abordé algo de esta naturaleza usando Procedimientos almacenados: encontrar el nivel más alto de un campo jerárquico: con vs sin CTE (24 de octubre de 2011)
Si miras en mi publicación, puedes usar las funciones GetAncestry y GetFamilyTree como modelo para atravesar el árbol desde cualquier punto dado.
ACTUALIZACIÓN 2012-12-11 12:11 EDT
Volví a mirar mi código desde mi publicación . Escribí la función almacenada para usted:
En realidad funciona Aquí hay una muestra:
Pero hay una sola trampa. Agregué una fila extra para el propietario
Aquí están los datos.
fuente
Aesta maneraA A/B A/B/C A/B/C/D A/B/C/E A/B/H A/B/H/G A/B/I A/B/I/J A/B/L A/F A/F/KLo que está utilizando se llama Modelo de lista de adyacencia . Tiene muchas limitaciones. Serás un problema cuando quieras eliminar / insertar un nodo en un lugar específico. Es mejor que use el modelo de conjunto anidado .
Hay una explicación detallada . Lamentablemente, el artículo en mysql.com ya no existe.
fuente