2014-11-03 38 views
0

我有这样的结构:Mysql的树结构计算谁是活跃的所有儿童

树: ID,PARENT_ID,LFT,rght邀请,USER_ID

用户: ID,用户名,活跃

我想要做的是一个单一的查询(可能与子查询??),将返回我树中的每个顶部节点的子数量在用户表中,活动设置为1.任何想法我怎么能去做这个?

+0

如果你的树中可以有任意数量的层次,那将会很困难。如果你知道你最多只有* n *个级别(n相当小),那么你可以在一个查询中做到这一点,该查询在'Tree'表格上执行至多* n * -1个自连接。 – 2014-11-03 17:50:34

回答

0

由于您显然可以拥有“无限”的关卡数量,所以这样的单一命令是不可能的。但你可以

1)通过多次SQL调用的递归算法在程序中进行计数(无论是php,java,还是其他)。 < - 如果可以的话,这样做。

2)将字段'cached_active_count'添加到树表,并在每次插入,更新和删除查询时使用触发器对其进行更新。这个选项最难设置,因为它需要几个触发器,并且很容易出错,但是如果你想要效率,那么这个选项可以快速读取结果。

3)制作SQL递归函数...但MySQL不喜欢递归,因此您需要使用循环和由临时表构成的队列进行伪递归,这不会再简单易懂。

4)生成SQL函数,它将循环遍历整个表中的查询,查找最底部没有计算的节点并逐层计算它们。这个解决方案可能是最简单的,但也是效率最低的。 *(最简单!=简单)

5)但是,如果除了“无限”深度实际上有限,我们假设深度最大N个级别,则可以制作由“N表”连接组成的“UGLY”sql select查询。