检查n深度树中的值?

时间:2012-10-06 10:14:11

标签: php mysql adjacency-list

我有两个实体postcategory,这是1:n关系。

我有一个包含两列{,1}},post_id

的参考表

category_id表格有categories列,id列和status

如果某个类别是另一个类别(n深度)的子类,那么它的parent_id不为空。

如果某个类别在线,则状态为1,否则为0。

我需要做的是找出帖子是否可见。

这需要:

加入帖子的Foreach类跟踪它的树到根节点(直到某个类别有parent_id == parent_id),如果这些类别中的任何一个有null 0那么路径被视为离线。

如果任何路径在线,则该帖子被视为可见,否则会被隐藏。

我能想到的唯一方法(作为半伪代码)是:

status

但是这可能最终导致很多sql查询,还有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

经典数据库与内存权衡。你正在做的是建造一个有树叶的树。要构建树,您需要递归循环叶子。来自数据库的有两种情况:

  1. 使用每个叶子的查询来递归构建树。你在内存中保存了一棵树。这就是你在做什么。
  2. 从数据库中获取平面结构,并在内存中构建树递归。你拿着一棵平树和真正的树在记忆中。这是你的替代方式。
  3. 什么是更好的取决于很多事情:你的硬件(磁盘访问与内存),树的大小,以命名两个。

答案 1 :(得分:0)

如果嵌套集不是一个选项,我知道以下内容:

  • 如果对数据进行了排序,以便父项的子项始终跟在父项之后,则可以通过跳过输出中的隐藏节点,对所有数据进行一次数据库查询来解决此问题。

这也适用于排序的嵌套集,this answer中已经概述了原则,但是关于获取深度的算法不起作用,我建议可以删除recursive iterator隐藏物品。

此外,如果数据未排序,您可以从the answer to Nested array. Third level is disappearing中列出的所有行的(未排序)查询创建树结构。不需要递归,你得到一个你可以轻松输出的结构,我应该在另一个答案中涵盖<ul>/<li> html样式输出。