这篇文章主要介绍Mysql如何通过邻接表存储树形结构,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
如何在数据库中存储树形结构呢?
像Mysql这样的关系型数据库,比较适合存储一些类似表格的扁平化数据,但是遇到像树形结构这样有深度的人,就很难驾驭了。
举个栗子:现在有一个要存储一下公司的人员结构,大致层次结构如下:
(画个图真不容易. .)
那么怎么存储这个结构?并且要获取以下信息:
<强> 1。查询小天的直接上司。强>
<强> 2。查询老宋管理下的直属员工。强>
<强> 3。查询小天的所有上司。强>
4。查询老王管理的所有员工。
<强>方案一、(邻接表)只存储当前节点的父节点信息。强>
创建表员工(
开斋节int,
ename VARCHAR (100),
,,,,,位置VARCHAR (100),
parent_id int
)
记录信息简单粗暴,那么现在存储一下这个结构信息:
好的,现在开始进入回答环节:
1。查询小天的直接上司:
选择e2.eid, e2。ename从员工e1, e2员工e1.parent_id=e2的地方。开斋节和e1.ename=& # 39;小天& # 39;;
2。查询老宋管理下的直属员工:
选择e1.eid, e1。ename从员工e1, e2员工e1.parent_id=e2的地方。开斋节和e2.ename=& # 39;老宋& # 39;;
3。查询小天的所有上司。
这里肯定没法直接查,只能用循环进行循环查询,先查直接上司,再查直接上司的直接上司,依次循环,这样麻烦的事情,还是得先建立一个存储过程:
睁大眼睛看仔细了,接下来是骚操作环节:
CREATE 定义者=案盄“localhost”, FUNCTION “getSuperiors”(“uid”, int), RETURNS varchar (1000), CHARSET gb2312 开始 DECLARE 才能;superiors  VARCHAR (1000), DEFAULT & # 39; & # 39;; DECLARE 才能sTemp INTEGER  DEFAULT uid; DECLARE 才能;tmpName  VARCHAR (20); WHILE 才能;(sTemp> 0),做的 ,,,SELECT parent_id into sTemp 得到employees where eid =, sTemp; ,,,SELECT ename into tmpName 得到employees where eid =, sTemp; ,,如果(sTemp> 0) ,,,,,SET superiors =, concat (& # 39;, tmpName & # 39;,上级); ,,,最终获得;如果; 最终获得才能;; ,,,SET superiors =,左(上级,CHARACTER_LENGTH(上级)1); RETURN 才能,上级;
结束这一段存储过程可以查询子节点的所有父节点,来试验一下
,
好的,骚操作完成。
显然,这样。获取子节点的全部父节点的时候很麻烦. .
4。查询老王管理的所有员工。
思路如下:先获取所有父节点为老王id的员工id,然后将员工姓名加入结果列表里,在调用一个神奇的查找函数,即可进行神奇的查找:
CREATE 定义者=案盄“localhost”, FUNCTION “getSubordinate”(“uid”, int), RETURNS varchar (2000), CHARSET gb2312 BEGIN ,, DECLARE str  varchar (1000),,, DECLARE cid  varchar (100); DECLARE result  VARCHAR (1000); DECLARE tmpName  VARCHAR (100); SET str =, & # 39; $ & # 39;,,,, SET cid =,演员(uid as char (10)),,,, WHILE cid  is not null  DO ,, SET 才能;str =, concat (str, & # 39; & # 39;,, cid),, SELECT 才能;group_concat (eid), INTO cid 得到employees where FIND_IN_SET (parent_id cid),,,,,,,,,, 最终获得;; SELECT 才能GROUP_CONCAT (ename), INTO result 得到employees WHERE FIND_IN_SET (parent_id str); RETURN ,结果,,,, 结束
看神奇的结果: