【发布时间】:2014-04-20 21:30:04
【问题描述】:
我有一个使用枚举路径表示层次结构的表:
id | name | path
-----+-------+-------
1 | Bob | 1
2 | Joe | 2
3 | Kyle | 2/3
4 | Sarah | 2/4
5 | Jim | 5
6 | Steve | 5/6
7 | Adam | 5/7
8 | Frank | 5/7/8
9 | Sue | 5/7/9
我需要一个查询来返回给定记录的直接子项,并且对于每个子项,返回其下所有子记录的计数。
例如,针对 Jim (id=5) 的查询应返回以下集合:
id | name | path | subrecords
-----+-------+-------+------------
6 | Steve | 5/6 | 0
7 | Adam | 5/7 | 2
尝试:
如果我这样做:
select did, name, path, SUBSTRING(path FROM '5\/[^\/]*$') as child_path from items where path ~ '5\/.*';
我得到了那里的一部分......
did | name | path | child_path
-----+-------+-------+---------
6 | Steve | 5/6 | 5/6
7 | Adam | 5/7 | 5/7
8 | Frank | 5/7/8 |
9 | Sue | 5/7/9 |
...但记录 8 和 9 需要汇总为小于 7 的计数。
我试过了:
select SUBSTRING(path FROM '5\/[^\/]*$') as child_path, COUNT(id) as count from items where path ~ '5\/.*' GROUP BY child_path;
这让我很兴奋:
child_path | count
----------+-------
| 2
5/7 | 1
5/6 | 1
没有。
我怎样才能做到这一点?
【问题讨论】:
标签: sql regex postgresql