我应该如何在给定的结构中执行树遍历?

时间:2009-11-02 12:08:59

标签: php mysql sql tree

我正试图在下面的一组表中找出孩子的数量。环境是LAMP,但是通过其他语法帮助正确的方向。

表格结构

users
-----
user_id  
parent_id


user_meta
---------
user_id
registration_date


user_levels
-----------
user_id
level

这种基本结构不太可能改变,但可以延长。

用例

select
  users.user_id
from
  users
inner join
  user_meta
  on users.user_id = user_meta.user_id
inner join
  user_levels
  on users.user_id = user_levels.user_id
where
  parent_id = *x*
  and
  registration_date > *certain date*
  and
  level < *certain level*

条件

  • 用户的后代只有在其级别低于给定*certain level*时才会计算。如果后代的级别不低,则该节点是叶子,但应从计数中排除。
  • 鉴于*certain level**certain date*对于每个查询/查询集都相同。

我已经尝试在循环中使用它,但查询量很快就会升级。这个解决方案可能会被用来存储在一个cron作业中,但我更喜欢一个实时的解决方案。

3 个答案:

答案 0 :(得分:1)

使用当前的数据模型,没有比递归查询数据库更有效的方法。如果您能够更改数据的存储方式以包含更多信息,则可以使用Modified Preorder Tree Traversal(也称为嵌套集模型)。该模型在MySQL website的文章中讨论。本网站上也有很多例子,只搜索“修改的预订树遍历”。

答案 1 :(得分:0)

将所有用户记录拉入本地内存并在其中运行算法可能会更快,具体取决于您拥有多少用户。 SQL不适合递归树遍历。

答案 2 :(得分:0)

有一个名为“公用表表达式”的SQL99功能,它允许您创建重复功能并有效处理存储在关系数据库中的分层数据。

看起来MySql还没有(还)实现它,但你可以看到可以用这个做什么: http://msdn.microsoft.com/en-us/library/ms190766.aspx