亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

【MySQL疑難雜癥】如何將樹形結構存儲在數據庫中(方案二Path Enumeration)

標簽:
MySQL

 

【MySQL疑难杂症】如何将树形结构存储在数据库中系列篇

如何将树形结构存储在数据库中(方案一 Adjacency List)

如何将树形结构存储在数据库中(方案二Path Enumeration)

如何将树形结构存储在数据库中(方案三 Closure Table)

今天来介绍把树形结构存入数据库的第二种方法——路径枚举法。

还是借用上一篇的栗子,为了方便大家查阅,我把图又原样搬过来了。
图片描述

需要回答的问题依旧是这样几个:

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

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

3.查询小天的所有上司。

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

方案二、 Path Enumeration 路径枚举法,记录下根节点到每个子节点的路径。

先创建表:

CREATE TABLE employees2(
eid INT,
ename VARCHAR(100),
position VARCHAR(100),
path VARCHAR(200)
)

然后插入数据:

图片描述

现在我们来回答一下之前的问题:

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

在上一个解决方案中能轻而易举做到的事情,在这个方案中却有些麻烦了,因为需要对path字段进行字符串处理,去掉“/”+自身id才是直接上司的path值。又开始一顿骚操作:

SELECT e1.eid,e1.ename FROM employees2 e1,employees2 e2 WHERE e2.ename = '小天' AND e1.path = REPLACE(e2.path,CONCAT('/',e2.eid),'');

好像这个操作还不够sao,2333,结果如下:

  图片描述

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

怎么查管理下的直属员工呢?那就要用模糊查询了:

SELECT e2.eid,e2.ename FROM employees2 e1,employees2 e2 WHERE e1.ename = '老宋' AND e2.path REGEXP CONCAT(e1.path,'/[0-9]{1,}$');

这里用了正则匹配,匹配所有path符合规则的记录,结果如下:

  图片描述

3.查询小天的所有上司。

SELECT e1.eid,e1.ename FROM employees2 e1,employees2 e2 WHERE e2.ename='小天' AND e2.path like concat(e1.path,'/%');

这里就能体现这种存储结构的优势了。不看效率的话,还是很方便的。

  图片描述

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

SELECT e2.eid,e2.ename FROM employees2 e1,employees2 e2 WHERE e1.ename='老王' AND e2.path like concat(e1.path,'/%');

看吧,查起来就so easy了。

 图片描述 

不用像之前那样写一大段存储过程了,简单粗暴。

小结一下,存储路径的方式在进行多级查询的时候十分方便,而在查询直接上下级的时候稍微复杂一点。还有一个很明显的缺点,那就是path的大小是指定的,所以理论上是不能进行无限层级的存储的,path值设置的越大,浪费的空间就越多。

至此,本篇介绍完毕,之后还会介绍其他方法,欢迎大家继续关注!

點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
JAVA開發工程師
手記
粉絲
1.8萬
獲贊與收藏
2564

關注作者,訂閱最新文章

閱讀免費教程

  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消