Mysql如何通过邻接表存储树形结构

  介绍

这篇文章主要介绍Mysql如何通过邻接表存储树形结构,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

如何在数据库中存储树形结构呢?

像Mysql这样的关系型数据库,比较适合存储一些类似表格的扁平化数据,但是遇到像树形结构这样有深度的人,就很难驾驭了。

举个栗子:现在有一个要存储一下公司的人员结构,大致层次结构如下:

 Mysql如何通过邻接表存储树形结构

(画个图真不容易. .)

那么怎么存储这个结构?并且要获取以下信息:

<强> 1。查询小天的直接上司。

<强> 2。查询老宋管理下的直属员工。

<强> 3。查询小天的所有上司。

4。查询老王管理的所有员工。

<强>方案一、(邻接表)只存储当前节点的父节点信息。

创建表员工(
开斋节int,
ename VARCHAR (100),
,,,,,位置VARCHAR (100),
parent_id int
)

记录信息简单粗暴,那么现在存储一下这个结构信息:

 Mysql如何通过邻接表存储树形结构

好的,现在开始进入回答环节:

1。查询小天的直接上司:

选择e2.eid, e2。ename从员工e1, e2员工e1.parent_id=e2的地方。开斋节和e1.ename=& # 39;小天& # 39;;

 Mysql如何通过邻接表存储树形结构

2。查询老宋管理下的直属员工:

选择e1.eid, e1。ename从员工e1, e2员工e1.parent_id=e2的地方。开斋节和e2.ename=& # 39;老宋& # 39;;

 Mysql如何通过邻接表存储树形结构

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 才能,上级;
  

结束这一段存储过程可以查询子节点的所有父节点,来试验一下

,  Mysql如何通过邻接表存储树形结构

好的,骚操作完成。

显然,这样。获取子节点的全部父节点的时候很麻烦. .

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 ,结果,,,,
  结束

看神奇的结果:

 Mysql如何通过邻接表存储树形结构

Mysql如何通过邻接表存储树形结构