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:
- Return是节点数最多的根
select largerId, amount from ....
+-----------+--------+
| largerId | amount |
+-----------+--------+
| 7 | 5 |
+-----------+--------+
- 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;
对于第二个,计算 person
和 supervises
的所有值的 UNION
。
SELECT count(*)
FROM (SELECT supervises
FROM elbat
UNION
SELECT person
FROM elbat) x;
我有一个递归的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:
- Return是节点数最多的根
select largerId, amount from .... +-----------+--------+ | largerId | amount | +-----------+--------+ | 7 | 5 | +-----------+--------+
- 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;
对于第二个,计算 person
和 supervises
的所有值的 UNION
。
SELECT count(*)
FROM (SELECT supervises
FROM elbat
UNION
SELECT person
FROM elbat) x;