SOUS-ARBRE DANS UN ARBRE dans MySQL
Dans mon MYSQL Database COMPANY
, j'ai une Table: Employee
association récursive, un employé peut être patron d'un autre employé. A self relationship of kind (SuperVisor (1)- SuperVisee (∞) )
.
Requête pour créer une table:
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;
J'ai inséré un ensemble de tuples (Requête):
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")
Les lignes insérées ont la relation arborescente-hiérarchique suivante :
A <---ROOT-OWNER
/|\
/ A \
B F
//| \ \
// | \ K
/ | | \
I L H C
/ | / \
J G D E
J'ai écrit une requête pour trouver une relation:
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;
Et la sortie est:
+------------+------------+----------+
| 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)
[ QUESTION ]
Au lieu d'un arbre hiérarchique complet, j'ai besoin SUB-TREE
d'un point (sélectif), par exemple:
si l'argument d'entrée est B
alors la sortie doit être comme ci-dessous ...
+------------+------------+----------+
| SuperVisor | SuperVisee | COUNT(*) |
+------------+------------+----------+
| B | C,H,I,L | 4 |
| C | D,E | 2 |
| H | G | 1 |
| I | J | 1 |
+------------+------------+----------+
Veuillez m'aider à ce sujet. Sinon, une procédure stockée peut être utile.
J'ai essayé, mais tous les efforts ont été inutiles!
mysql
stored-procedures
Grijesh Chauhan
la source
la source
It my experience
J'ai toujours eu une meilleure réponse de la part des experts . Et je pense qu'il était préférable de déplacer la question aux administrateurs de base de données. Dans tous les cas, je suis très reconnaissant envers stackoverflow et les personnes qui sont actives ici. J'ai vraiment trouvé une solution à de nombreux problèmes qui étaient très difficiles à trouver moi-même ou tout autre site Web.Réponses:
J'ai déjà abordé quelque chose de cette nature en utilisant des procédures stockées: trouver le plus haut niveau d'un champ hiérarchique: avec vs sans CTE (24 octobre 2011)
Si vous regardez dans mon article, vous pouvez utiliser les fonctions GetAncestry et GetFamilyTree comme modèle pour parcourir l'arbre à partir d'un point donné.
MISE À JOUR 2012-12-11 12:11 EDT
J'ai regardé mon code depuis mon post . J'ai rédigé la fonction stockée pour vous:
Cela fonctionne réellement. Voici un exemple:
Il n'y a qu'une seule prise. J'ai ajouté une ligne supplémentaire pour le propriétaire
Voici les données
la source
A
ce genreA 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/K
Ce que vous utilisez est appelé modèle de liste d'adjacence . Il a beaucoup de limites. Vous aurez un problème lorsque vous souhaitez supprimer / insérer un nœud à un endroit spécifique. Il vaut mieux utiliser le modèle de jeu imbriqué .
Il y a une explication détaillée . Malheureusement l'article sur mysql.com n'existe plus.
la source