我有这样的结构:
树: id,parent_id,lft,rght,user_id
用户: id,username,active
我想要做的是单个查询(可能带有子查询??),它将返回树中WHERE中每个顶级节点的子计数,在user表中,active设置为1.任何想法如何我能解决这个问题吗?
答案 0 :(得分:0)
因为你显然可以拥有无限制的'水平计数,这样的单一命令是不可能的。但你可以
1)通过具有多个SQL调用的递归算法在程序中进行计数(无论是php,java,等等)。 < - 如果可以,请这样做。
2)添加字段' cached_active_count'到Tree表并使用每个插入,更新和删除查询的触发器更新它。此选项最难设置,因为它需要多个触发器并且很容易出错,但如果您想要效率,那么这个选项可以最快地读取结果。
3)使SQL递归函数......但是MySQL并不喜欢递归,因此你需要使用由临时表组成的循环和队列进行伪递归,这不会是简单的简单代码。
4)创建将循环运行查询整个表的SQL函数,查找最底部未计算的节点并逐层计算它们。这个解决方案可能是最简单的*,但效率最低。 *(最简单!=简单)
5)但是,如果你除了"无限制"深度实际上是有限的,让我们说最深N级,你可以做出'#G; UGLY" sql select查询由N个表连接组成...