SUB-ÁRBOL DENTRO DE UN ÁRBOL en MySQL
En mi MYSQL Database COMPANY
, tengo una Table: Employee
asociació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-TREE
desde un punto (selectivo), por ejemplo:
si el argumento de entrada es, B
entonces 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!
It my experience
Siempre 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.