新手问题 树形结构数据表如何查询最底一层的所有数据

miserytan · 发布于 2017年07月18日 · 最后由 bysxiang 回复于 2017年07月20日 · 749 次阅读
5c8fb2

我有一个树形结构的数据表,这个树形结构固定只有四层,第一层固定不会增减,二、三层有可能增加但不会减少,最后一层的数据可增、删、改

现在我想取出最后一层的所有数据集合。

树形结构如下

表结构如下

我用的数据库为redmine自带的sqlite3

请教前辈们我该怎么做,给个思路

共收到 18 条回复
96

应该贴出这表的结构。可以看看这个

https://github.com/collectiveidea/awesome_nested_set
5c8fb2
32bingbug 回复

这回好了吧,我不允许再填gem了

3楼 已删除
96
xxx.where.not(parent: xxx.all.map(&:id))

这样应该可以😂

5c8fb2
32bingbug 回复

额,我觉得这种方法可能行不通,打出来的结果是: SELECT "product_catalogs".* FROM "product_catalogs" WHERE ("product_catalogs"."parent_id" NOT IN (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)) 因为我的这个表第二层和第三层不会不变的,可能增加但不会减少,所以没办法指定map(:id)到第几个

96
5c8fb2miserytan 回复

表结构再增加一个level可以了

96

我觉得你就是要找parent_id为最大的集合 试试下面的查询

ProductCatalog.select("product_catalogs.*").order("parent_id desc").group_by(&:parent_id).first[1]
96
32will_c_j 回复

这样也不行,不能确定是第几层

15139

我只能告诉你数据库不适合拿来做这个。

如果你一定要用数据库来做,那考虑用MySQL或者是MSSQL甚至是Oracle然后写存储过程。

775

加个trigger,新增数据记录depth

11楼 已删除
96
第一层 first_level = ProductCatalog.where("parent_id is null")
第二层 second_level = ProductCatalog.where(parent_id:first_level.collect(&:id))
第三层 third_level = ProductCatalog.where(parent_id:second_level.collect(&:id))
第四层 fourth_level = ProductCatalog.where(parent_id:third_level.collect(&:id))
19766

缓存一二三层的id,然后剩下的就是第四层😂

9643

只有parent适用于两层,不适用于多层,建议增加level字段,这样表结构更清晰,取哪一层都方便了

7284d6

closure tables

075528

感觉只能考虑增加字段了,上面说的增加层数,以及每一个node不只是保存parent id 而是保存整个 ancestor 链的 id ,

5c8fb2

多谢大家分享经验与意见,已经做出来了,通过触发事件,保存其所在层级。

A908ae

如果用某些开源的树结构gem来构建树就简单啦,比如Ancestry之类

Abca79
32will_c_j 回复

这个方法似乎也是不行的 并不是所有的底层的节点都在同一个 Level 上

96

使用闭包表结构吧,parent_id明显不适合这种多层的。

5c8fb2 miserytan 关闭了讨论 07月21日 11:01
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册