我有很多棵这样的树存储在数据库里 CREATE TABLE tree ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(20) NOT NULL, lft int(11) NOT NULL, rgt int(11) NOT NULL, PRIMARY KEY (id) ..

大神们,树的检索问题请教

本贴最后更新于 910 天前,其中的信息可能已经天翻地覆

我有很多棵这样的树存储在数据库里

CREATE TABLE tree (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(20) NOT NULL,
lft int(11) NOT NULL,
rgt int(11) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

1、如何根据根结点查询出整棵树?

2、如何用 SQL 算出某一树结点的深度?

3、如何根据某一结点查询出从根结点到这棵树路径 + 深度?

4、如何查询出结点的所有直接子结点 + 深度?

8ca79fbcb662410688f1708f52af7eff.png

  • 2 引用 • 39 回帖
  • 检索
    1 引用 • 9 回帖
  • 算法
    254 引用 • 182 回帖 • 11 关注
  • SQL
    78 引用 • 238 回帖 • 3 关注
9 回帖   
请输入回帖内容...
  • gaosheng  

    1. select t.* from tree t inner join tree root ON t.lft >= root.lft and t.rgt <= root.rgt order by t.lft asc;
    2. select count(1) from tree t inner join tree child ON t.lft <= child.lft and t.rgt >= child.rgt;
    3. select t.* from tree t inner join tree child ON t.lft <= child.lft and t.rgt >= child.rgt order by t.lft asc; 查询结果就是树路径,结果 size 就是深度
    4. 子节点查询方法跟 1 一样啊,深度建议在表中单加一字段维护

    2 回复
  • meikaiyipian        

    ON t.lft >= root.lft and t.rgt <= root.rgt 这样会查出不同树之间的结点

    c7bf91b536864eefae149c9c41de4e30.png

  • meikaiyipian        

    加上 `root.name = 'A'
    也不行

    d65d22cd4cc3422c87d136f1736618f3.png

  • eddy

    • 按照你的表设计来看应该是二叉树,这就和你的树形结构图不符(根结点有三个树枝节点)
    • 按照你的表设计,虽然可以满足二叉树的存储,但是按照你的查询需求 SQL 会很复杂,建议表扩展一个字段,定义为当前节点的所有父节点,如 E 的父节点字段记为:A:B
      • 根结点查询出这个树是否使用新增字段均可
      • 深度使用新增字段
      • 路径使用新增字段
      • 查询子节点不需使用新增字段,查询深度使用新增节点

    1 回复
  • meikaiyipian        

    呃。。。不是二叉树,就是普通树

    1 回复
  • eddy      

    我的思路就是,不单单只存储子节点信息,同时存储父节点信息,这样无论是查找路径还是查找深度,或者是构建整棵树(从根结点由上至下构建)都会简单些

    1 回复
  • meikaiyipian        

    你的意思是再加一个字段存取父结点 `id 是吗

    1 回复
  • eddy      

    嗯,存当前节点所有父节点的 ID,如你文章中的截图,叶子节点 E 存储 父节点信息:A 和 B

    1 回复
  • meikaiyipian        

    明白了,多谢

请输入回帖内容 ...