MariaDb/Mysql 查询以计算树中的节点并找到最大节点

MariaDb/Mysql Query to count nodes in a tree and find largest node

我有一个递归的table来表示监督关系,一个人可以监督很多人,也可以被其他很多人监督。

这里是一个示例数据:

+--------+------------+
| person | supervises |
+--------+------------+
|      1 |          2 |
|      1 |          3 |
|      1 |          4 |
|      1 |          7 |
|      3 |          5 |
|      4 |          5 |
|      5 |          8 |
|      4 |          6 |
|      4 |          7 |
|      6 |          9 |
|      7 |          9 |
|      9 |         14 |
|     14 |         15 |
|      3 |         15 |
|      7 |         10 |
|      7 |         11 |
|      7 |         12 |
|      7 |         13 |
+--------+------------+

可以代表

其中,蓝色节点代表较大的子树,红色节点代表较大树的根。

我的问题是,创建一个 MariaDb(10.4.1)/Mysql 查询,给定一个节点,例如节点号 1:

  1. Return是节点数最多的根
select largerId, amount from ....
+-----------+--------+
| largerId  | amount |
+-----------+--------+
|         7 |      5 |
+-----------+--------+
  1. Return 树中的最大节点数(在这种情况下为 15)
select .... where id = 1

+-----------+
| count(id) |
+-----------+
|        15 |
+-----------+

其他例子

select .... where id = 7

+-----------+
| count(id) |
+-----------+
|         8 |
+-----------+

这不需要递归,因为您只对直接子代感兴趣。

对于第一个 GROUP BY person 并将结果限制为按计数降序排列的第一行。

SELECT person,
       count(*)
       FROM elbat
       GROUP BY person
       ORDER BY count(*) DESC
       LIMIT 1;

对于第二个,计算 personsupervises 的所有值的 UNION

SELECT count(*)
       FROM (SELECT supervises
                    FROM elbat
             UNION
             SELECT person
                    FROM elbat) x;

db<>fiddle