【问题标题】:How to set nested path values in the tree structure?如何在树结构中设置嵌套路径值?
【发布时间】:2021-04-11 08:55:45
【问题描述】:

在我们的数据库中,树结构是这样实现的:

name      path       pos_left     pos_right     pos_level

folder1              207          214           1
file1                208          209           2
file2                210          211           2
file3                212          213           2

我需要设置路径的值,这样 pos_level 为 2 的行将如下所示:folder1/file1、folder1/file2、folder1/file3。 所以我需要一个 SQL 查询,它将“父”文件夹的名称(但在我们的系统中没有使用 parent_id,只有 pos_left、pos_right、pos_level)与“/”连接,然后与实体名称连接。

我已经有了简单的东西:

UPDATE table SET path = name WHERE pos_level = 1

我需要这个:

UPDATE table SET path = (code I don't know) WHERE pos_level = 2

谢谢!

【问题讨论】:

  • 那么如何从嵌套集合构建物化路径
  • 你用的是哪个版本的mysql?
  • 谢谢,我会用谷歌搜索的! mysql 版本:phpinfo 显示客户端 API 版本 5.0.12
  • 这将在 8+ 中大大简化
  • 第一行的路径是什么?

标签: mysql sql tree sql-update


【解决方案1】:

由于您使用的是旧版本的 MySQL,递归超出了范围。我已经使用自我加入来获得您想要的结果。请在查询中使用您的表名而不是treestructure

架构和插入语句:

 create table treestructure(name varchar(50),   path varchar(100), pos_left int,pos_right int,pos_level int)
 
 insert into treestructure(name, pos_left,pos_right ,pos_level ) values('folder1',   207,          214,           1);
 insert into treestructure(name, pos_left,pos_right ,pos_level ) values('file1',     208,          209,           2);
 insert into treestructure(name, pos_left,pos_right ,pos_level ) values('file2',     210,          211,           2);
 insert into treestructure(name, pos_left,pos_right ,pos_level ) values('file3',     212,          213,           2);

更新查询:

 update treestructure t
 left join treestructure ts on ts.pos_level=t.pos_level-1 and t.pos_left between ts.pos_left and ts.pos_right  and  t.pos_right between ts.pos_left and ts.pos_right
 set t.path=(case when t.pos_level=1 then t.name else concat(ts.name,'/',t.name) end);

选择查询:

 select*from treestructure;

更新后的输出:

name path pos_left pos_right pos_level
folder1 folder1 207 214 1
file1 folder1/file1 208 209 2
file2 folder1/file2 210 211 2
file3 folder1/file3 212 213 2

db小提琴here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多