UNTERBAUM IN EINEM BAUM in MySQL
In meinem MYSQL habe Database COMPANY
ich eine Table: Employee
rekursive Assoziation, ein Mitarbeiter kann Chef eines anderen Mitarbeiters sein. A self relationship of kind (SuperVisor (1)- SuperVisee (∞) )
.
Abfrage zum Erstellen einer Tabelle:
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;
Ich habe eine Reihe von Tupeln eingefügt (Abfrage):
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")
Die eingefügten Zeilen haben folgende Baum-Hierarchie-Beziehung :
A <---ROOT-OWNER
/|\
/ A \
B F
//| \ \
// | \ K
/ | | \
I L H C
/ | / \
J G D E
Ich habe eine Anfrage geschrieben, um eine Beziehung zu finden:
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;
Und die Ausgabe ist:
+------------+------------+----------+
| 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)
[ FRAGE ]
Anstelle des vollständigen hierarchischen Baums benötige ich ein SUB-TREE
von einem Punkt (selektiv) zB:
Wenn das Eingabeargument B
dann ausgegeben wird, sollte es wie folgt aussehen ...
+------------+------------+----------+
| SuperVisor | SuperVisee | COUNT(*) |
+------------+------------+----------+
| B | C,H,I,L | 4 |
| C | D,E | 2 |
| H | G | 1 |
| I | J | 1 |
+------------+------------+----------+
Bitte helfen Sie mir dabei. Wenn dies nicht der Fall ist, kann eine gespeicherte Prozedur hilfreich sein.
Ich habe es versucht, aber alle Anstrengungen waren nutzlos!
quelle
It my experience
Ich habe immer bessere Antworten von Experten bekommen . Und ich denke, es war eine bessere Entscheidung, Fragen an Datenbankadministratoren zu übertragen. In allen Fällen bin ich Stackoverflow und den hier aktiven Leuten sehr dankbar. Ich habe wirklich eine Lösung für viele Probleme gefunden, die sehr schwierig waren, mich selbst oder ein anderes Web zu finden.Antworten:
Mit Stored Procedures habe ich bereits etwas Ähnliches angesprochen: Finde die höchste Ebene eines hierarchischen Feldes: mit vs ohne CTEs ( 24.10.2011 )
Wenn Sie in meinem Beitrag nachsehen, können Sie die Funktionen GetAncestry und GetFamilyTree als Modell verwenden, um den Baum von einem bestimmten Punkt aus zu durchlaufen.
UPDATE 11.12.2012 12:11 EDT
Ich habe meinen Code von meinem Post zurückgeschaut . Ich habe die Stored Function für Sie geschrieben:
Es funktioniert tatsächlich. Hier ist ein Beispiel:
Es gibt nur einen Haken. Ich habe eine zusätzliche Zeile für den Eigentümer hinzugefügt
Hier sind die Daten
quelle
A
dieser Art zu bekommenA 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
Was Sie verwenden, heißt Adjacency List Model . Es gibt viele Einschränkungen. Sie werden Probleme haben, wenn Sie einen Knoten an einer bestimmten Stelle löschen / einfügen möchten. Es ist besser, wenn Sie das verschachtelte Set-Modell verwenden .
Es gibt eine detaillierte Erklärung . Leider existiert der Artikel auf mysql.com nicht mehr.
quelle