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

miserytan · 2017年07月18日 · 最后由 bysxiang 回复于 2017年07月20日 · 3900 次阅读

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

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

树形结构如下

表结构如下

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

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

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

https://github.com/collectiveidea/awesome_nested_set
bingbug 回复

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

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

这样应该可以😂

bingbug 回复

额,我觉得这种方法可能行不通,打出来的结果是: 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)到第几个

miserytan 回复

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

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

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

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

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

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

加个 trigger,新增数据记录 depth

11 楼 已删除
第一层 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))

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

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

closure tables

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

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

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

will_c_j 回复

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

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

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