MySQL'de AĞAÇ İLE ALT AĞAÇ
MYSQL'de Database COMPANY
, Table: Employee
özyinelemeli bir birliktelik var , bir çalışan diğer çalışanın patronu olabilir. A self relationship of kind (SuperVisor (1)- SuperVisee (∞) )
.
Tablo Oluşturma Sorgusu:
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;
Bir dizi tuples (Sorgu) ekledim:
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")
Girilen satırlar aşağıdaki Ağaç-Hiyerarşik-İlişkisine sahiptir :
A <---ROOT-OWNER
/|\
/ A \
B F
//| \ \
// | \ K
/ | | \
I L H C
/ | / \
J G D E
İlişki bulmak için bir sorgu yazdım:
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;
Ve çıktı:
+------------+------------+----------+
| 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)
[ SORU ]
Tam Hiyerarşik Ağaç yerine, SUB-TREE
bir noktadan (seçmeli) ihtiyacım var örn .:
Girdi argümanı daha B
sonra çıktı aşağıdaki gibi olmalıdır ...
+------------+------------+----------+
| SuperVisor | SuperVisee | COUNT(*) |
+------------+------------+----------+
| B | C,H,I,L | 4 |
| C | D,E | 2 |
| H | G | 1 |
| I | J | 1 |
+------------+------------+----------+
Lütfen bu konuda bana yardım et. Sorgu değilse, saklı yordam yardımcı olabilir.
Denedim, ama tüm çabalar işe yaramadı!
It my experience
Her zaman uzman taraflardan daha iyi cevap aldım . Ve bence soruyu Veritabanı Yöneticilerine taşımak daha iyi bir karardı. Her durumda, yığın akışı ve burada aktif olan insanlara çok minnettarım. Kendimi veya başka bir web'i bulmak çok zor olan birçok soruna gerçekten çözüm buldum.