SUB-TREE DALAM WILAYAH dalam MySQL
Di MYSQL saya Database COMPANY
, saya memiliki Table: Employee
asosiasi rekursif, seorang karyawan dapat menjadi bos bagi karyawan lain. A self relationship of kind (SuperVisor (1)- SuperVisee (∞) )
.
Permintaan Membuat Tabel:
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;
Saya telah memasukkan satu set tupel (Kueri):
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")
Baris yang dimasukkan mengikuti Tree-Hierarch-Relationship :
A <---ROOT-OWNER
/|\
/ A \
B F
//| \ \
// | \ K
/ | | \
I L H C
/ | / \
J G D E
Saya menulis kueri untuk menemukan hubungan:
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;
Dan outputnya adalah:
+------------+------------+----------+
| 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)
[ PERTANYAAN ]
Alih-alih menyelesaikan Hierarchical Tree, saya memerlukan SUB-TREE
dari titik (selektif) misalnya:
Jika argumen input B
maka output harus seperti di bawah ini ...
+------------+------------+----------+
| SuperVisor | SuperVisee | COUNT(*) |
+------------+------------+----------+
| B | C,H,I,L | 4 |
| C | D,E | 2 |
| H | G | 1 |
| I | J | 1 |
+------------+------------+----------+
Tolong bantu saya dalam hal ini. Jika bukan permintaan, prosedur tersimpan dapat membantu.
Saya mencoba, tetapi semua upaya tidak berguna!
mysql
stored-procedures
Grijesh Chauhan
sumber
sumber
It my experience
Saya selalu mendapat jawaban yang lebih baik dari sisi ahli . Dan saya pikir itu keputusan yang lebih baik untuk memindahkan pertanyaan ke Administrator Database. Dalam semua kasus, saya sangat berterima kasih kepada stackoverflow dan orang-orang yang aktif di sini. Saya benar-benar mendapat solusi untuk banyak masalah yang sangat sulit untuk menemukan diri saya atau web lain.Jawaban:
Saya sudah membahas sesuatu seperti ini menggunakan Prosedur Tersimpan: Temukan tingkat tertinggi dari bidang hierarkis: dengan vs tanpa CTE (24 Okt 2011)
Jika Anda melihat di posting saya, Anda bisa menggunakan fungsi GetAncestry dan GetFamilyTree sebagai model untuk melintasi pohon dari titik mana pun.
UPDATE 2012-12-11 12:11 EDT
Saya melihat kembali kode saya dari posting saya . Saya menulis Fungsi Tersimpan untuk Anda:
Ini benar-benar berfungsi. Berikut ini contohnya:
Hanya ada satu tangkapan. Saya menambahkan satu baris tambahan untuk pemilik
Ini datanya
sumber
A
seperti iniA 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
Apa yang Anda gunakan disebut Adjacency List Model . Ini memiliki banyak keterbatasan. Anda akan bermasalah ketika ingin menghapus / menyisipkan simpul di tempat tertentu. Lebih baik Anda menggunakan Nested Set Model .
Ada penjelasan terperinci . Sayangnya artikel di mysql.com tidak ada lagi.
sumber