从层次结构路径计数 children
Count children from hierarchy path
我有一个 table 这样的:
id
name
path
1
John
/1
2
Mark
/2
3
Kevin
/1/3
4
Sarah
/1/3/4
5
Andy
/2/5
...
...
...
所以,我可以说 Sarah 是 Kevin 的 child,也就是 John 的 child。
我想要这个:
id
name
path
number of children
1
John
/1
2
2
Mark
/2
1
3
Kevin
/1/3
1
4
Sarah
/1/3/4
0
5
Andy
/2/5
0
...
...
...
...
任务编号 2:
假设我也有这个table
id
income
user_id
1
200
1
2
120
1
3
340
2
4
500
3
5
600
5
6
80
5
我可以说约翰的总收入是320$,但是如果我还要算约翰的children,那就是820$(因为id=3是约翰的child) .所以,我也想要一个可以计算所有等级收入的查询。
你可以这样做:
select
t.*,
(select count(*) from t c where c.path like t.path || '/%') as c_count,
i.income + (
select coalesce(sum(i.income), 0) from t c join i on i.user_id = c.id
where c.path like t.path || '/%'
) as c_income
from t
left join (
select user_id, sum(income) as income from i group by user_id
) i on i.user_id = t.id
结果:
id name path c_count c_income
--- ------ ------- -------- --------
1 John /1 2 820
2 Mark /2 1 1020
3 Kevin /1/3 1 500
4 Sarah /1/3/4 0 null
5 Andy /2/5 0 680
参见 DB Fiddle 中的示例。
我有一个 table 这样的:
id | name | path |
---|---|---|
1 | John | /1 |
2 | Mark | /2 |
3 | Kevin | /1/3 |
4 | Sarah | /1/3/4 |
5 | Andy | /2/5 |
... | ... | ... |
所以,我可以说 Sarah 是 Kevin 的 child,也就是 John 的 child。
我想要这个:
id | name | path | number of children |
---|---|---|---|
1 | John | /1 | 2 |
2 | Mark | /2 | 1 |
3 | Kevin | /1/3 | 1 |
4 | Sarah | /1/3/4 | 0 |
5 | Andy | /2/5 | 0 |
... | ... | ... | ... |
任务编号 2: 假设我也有这个table
id | income | user_id |
---|---|---|
1 | 200 | 1 |
2 | 120 | 1 |
3 | 340 | 2 |
4 | 500 | 3 |
5 | 600 | 5 |
6 | 80 | 5 |
我可以说约翰的总收入是320$,但是如果我还要算约翰的children,那就是820$(因为id=3是约翰的child) .所以,我也想要一个可以计算所有等级收入的查询。
你可以这样做:
select
t.*,
(select count(*) from t c where c.path like t.path || '/%') as c_count,
i.income + (
select coalesce(sum(i.income), 0) from t c join i on i.user_id = c.id
where c.path like t.path || '/%'
) as c_income
from t
left join (
select user_id, sum(income) as income from i group by user_id
) i on i.user_id = t.id
结果:
id name path c_count c_income
--- ------ ------- -------- --------
1 John /1 2 820
2 Mark /2 1 1020
3 Kevin /1/3 1 500
4 Sarah /1/3/4 0 null
5 Andy /2/5 0 680
参见 DB Fiddle 中的示例。