【问题标题】:How do you calculate the depth of a tree with a sql statement?如何用sql语句计算树的深度?
【发布时间】:2018-09-08 09:42:54
【问题描述】:

我不太明白递归查询是如何工作的以及如何解决这个问题。我们得到了左边的表格,结构看起来像右边的树:

ID | Parent                        1
1     null                        / \
2     1                          2   3
3     1                               \
4     3                                4
5     4                               / \
6     4                              5   6   
7     6                                   \ 
                                           7 

我知道如何获取每个节点的所有父节点...但我不知道如何找到树的最大深度。这意味着我必须找出这棵树有多少层。我们没有得到更多信息

如果您能给我一个 mysql 的解决方案,我将非常感激,但是任何 sql 语句都会帮助我解决这个问题

提前致谢!

【问题讨论】:

  • 哪个版本的mysql?最新版本支持递归 CTE 查询,但早期版本没有此功能。取决于您的版本,查询会有所不同。
  • 如果您的信息存储在数据库中,例如在父列中,您可能可以使用 COUNT 来获取该列中有多少条记录,结果是深度。 ps,使用count distinct仅获取深度而不是所有父母,在您的示例中使用count distinct您不考虑值2和5,而只考虑1,3,4,6,7所以结果必须是= 5 ...如果我明白你的问题;)
  • 如果您不在 MySQL 8 上,下面 Lucasz 的递归 CTE 将无法工作,因此您可以使用 this answer 中的过程
  • 非常感谢你们的 cmets,我忘了提到我有 mysql 8.0,我可以使用递归。 @Lukasz Szozda 的回答完美!

标签: mysql sql tree recursive-query


【解决方案1】:

您可以使用RECURSIVE cte (MySQL 8.0):

WITH RECURSIVE cte AS (
   SELECT 1 AS lvl, Parent, id
   FROM tab
   WHERE Parent IS NULL
   UNION ALL
   SELECT lvl + 1, tab.Parent, tab.id
   FROM tab
   JOIN cte
     ON tab.Parent = cte.Id
)
SELECT *  -- MAX(lvl) AS max_depth_of_tree
FROM cte;

输出:

┌──────┬─────────┬────┐
│ lvl  │ Parent  │ id │
├──────┼─────────┼────┤
│   1  │         │  1 │
│   2  │      1  │  2 │
│   2  │      1  │  3 │
│   3  │      3  │  4 │
│   4  │      4  │  5 │
│   4  │      4  │  6 │
│   5  │      6  │  7 │
└──────┴─────────┴────┘

DBFiddle Demo

【讨论】:

  • 天哪,非常感谢。这正是我一直在寻找的!它完美地工作
猜你喜欢
  • 1970-01-01
  • 2010-12-24
  • 1970-01-01
  • 1970-01-01
  • 2011-02-15
  • 2022-01-25
  • 2010-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多