ПОДДЕРЖКА В ДЕРЕВЕ в MySQL
В моем MYSQL Database COMPANY
у меня Table: Employee
рекурсивная ассоциация, сотрудник может быть начальником другого сотрудника.A self relationship of kind (SuperVisor (1)- SuperVisee (∞) )
,
Запрос на создание таблицы:
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;
Я вставил набор кортежей (Query):
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")
Вставленные строки имеют следующие Tree-Hierarchical-Relationship :
A <---ROOT-OWNER
/|\
/ A \
B F
//| \ \
// | \ K
/ | | \
I L H C
/ | / \
J G D E
Я написал запрос, чтобы найти отношения:
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;
И вывод:
+------------+------------+----------+
| 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)
[ ВОПРОС ]
Вместо полного Иерархического дерева, мне нужно SUB-TREE
из точки (выборочно), например:
Если входной аргумент является, B
то вывод должен быть как показано ниже ...
+------------+------------+----------+
| SuperVisor | SuperVisee | COUNT(*) |
+------------+------------+----------+
| B | C,H,I,L | 4 |
| C | D,E | 2 |
| H | G | 1 |
| I | J | 1 |
+------------+------------+----------+
Пожалуйста помоги мне с этим. Если нет запроса, хранимая процедура может быть полезна.
Я пытался, но все усилия были бесполезны!
mysql
stored-procedures
Грижеш Чаухан
источник
источник
It my experience
Я всегда получал лучший ответ от экспертов . И я думаю, что это было лучшее решение перенести вопрос к администраторам баз данных. Во всех случаях я очень благодарен стекопотокам и людям, которые здесь активны. Я действительно получил решение для многих проблем, которые было очень трудно найти себе или любой другой сети.Ответы:
Я уже обращался к чему-то подобному с помощью хранимых процедур: найдите наивысший уровень иерархического поля: против и без CTE (24 октября 2011 г.)
Если вы посмотрите мой пост, вы можете использовать функции GetAncestry и GetFamilyTree в качестве модели для обхода дерева из любой заданной точки.
ОБНОВЛЕНИЕ 2012-12-11 12:11 ПО ВОСТОЧНОМУ ВРЕМЕНИ
Я оглянулся на мой код из моего поста . Я написал Хранимую функцию для вас:
Это на самом деле работает. Вот образец:
Есть только один улов. Я добавил одну дополнительную строку для владельца
Вот данные
источник
A
как этоA 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
То, что вы используете, называется моделью списка смежности . У него много ограничений. У вас будут проблемы, когда вы захотите удалить / вставить узел в определенном месте. Лучше использовать модель вложенного набора .
Есть подробное объяснение . К сожалению, статья на mysql.com больше не существует.
источник