代码之家  ›  专栏  ›  技术社区  ›  chelmertz user1604064

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

  •  0
  • chelmertz user1604064  · 技术社区  · 15 年前

    使命

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

    表结构

    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 date* 对于每个查询/一组查询都是相同的。

    我试过在循环中使用它,但是查询量很快就会增加。这个解决方案可能会被使用并存储在cron作业中,但我更喜欢一个实时的解决方案。

    3 回复  |  直到 7 年前
        1
  •  1
  •   John    15 年前

    对于当前的数据模型,没有比递归查询数据库更有效的方法了。如果您能够更改存储数据的方式以包含更多信息,则可以使用修改后的预订单树遍历(也称为嵌套集模型)。这个模型在一篇关于 MySQL website . 在这个网站上也有很多例子,只需搜索“修改的预订单树遍历”。

        2
  •  0
  •   Amber    15 年前

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

        3
  •  0
  •   Manitra Andriamitondra    15 年前

    有一个称为“公共表表达式”的SQL99功能开关,它允许您创建递归函数并有效地处理存储在关系数据库中的分层数据。

    看起来MySQL还没有实现它,但是您可以看到如何使用它: http://msdn.microsoft.com/en-us/library/ms190766.aspx