【问题标题】:Hierarchical Data in MySqlMySql 中的分层数据
【发布时间】:2013-12-19 22:12:40
【问题描述】:

我有一个包含父子关系的表,我需要有关递归查询的帮助

表结构

roleId,  roleName,      parentId
1        Admin          0
2        Backup Admin   1
3        Office User 1  0
4        User 1         3
5        User 2         3
6        Office User 2  0
7        Off User 1     6

我正在尝试进行递归查询,但我无法做到 请建议我应该如何查询数据库 例如

  Admin
  -- Backup Admin
  Office User 1
  -- User 1
  -- User 2
  Office User 2
  -- Off User 1

【问题讨论】:

    标签: sql mysql hierarchy


    【解决方案1】:

    正如上面所指出的,这并不是真正的递归,但如果您知道最多需要多少步,您可以使用这些方法(也许使用 PHP 来生成查询):

    我首先将父 ID 设置为 NULL 而不是 0,但这是个人喜好。

    SELECT * FROM table t1
    LEFT JOIN table t2 ON t2.parent_id = t1.role_id
    LEFT JOIN table t3 ON t3.parent_id = t2.role_id
    WHERE t1.parent_id IS NULL
    

    ^^ 在这种情况下你需要走多远。

    [下一点不严格相关]

    然后您可以按照以下方式操作输出:

    SELECT
            (CASE 
            WHEN (t1.name IS NULL AND t2.name IS NULL) THEN t3.name
            WHEN (t1.name IS NULL AND t2.name IS NOT NULL) THEN t2.name
            ELSE t1.name END)  AS first,
            (CASE 
            WHEN (t1.name IS NOT NULL AND t2.name IS NOT NULL) THEN t2.name
            WHEN (t2.name IS NULL AND t3.name IS NOT NULL) THEN NULL
            ELSE t3.name END)  AS second,
            (CASE 
            WHEN (t1.name IS NOT NULL) THEN t3.name
            ELSE  NULL END)  AS third
    FROM
    

    【讨论】:

    • 编辑:第二部分可能与您的问题无关,这只是将“最深”值分配给“第一”列。
    【解决方案2】:

    查询表一次,获取所有名称和 ID,然后用您使用的任何编程语言构建树。

    【讨论】:

      【解决方案3】:

      MySQL直接不支持递归查询。

      您需要通过编写一个将递归堆栈保存在会话变量中的函数来模拟它。

      请参阅我的博客中的这篇文章,了解如何执行此操作:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-24
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 2013-03-28
        • 2013-06-12
        • 2012-01-31
        • 1970-01-01
        相关资源
        最近更新 更多