在尝试为这个问题找到一个合适的解决方案并且几乎将所有的头发都拉出来之后,我决定前来寻求帮助。按照CTE的年龄段划分父母和子女的年龄
问题:
我有4列,看起来像这样的表:
id | family_id | parent_id | age |
-------------------------------------
1 | 1 | 0 | 45 |
2 | 1 | 7 | 23 |
3 | 1 | 0 | 59 |
4 | 1 | 5 | 12 |
5 | 1 | 1 | 27 |
6 | 1 | 7 | 18 |
7 | 1 | 1 | 30 |
8 | 1 | 1 | 32 |
9 | 1 | 6 | 9 |
使用CTE我找出谁是孩子是父母的,并通过路径排序他们,与父母相关联。像这样:
WITH RECURSIVE cte (id, path, family_id, parent_id, age) AS (
SELECT id, array[id] AS path, family_id, parent_id, age
FROM test
WHERE parent_id=0
AND family_id=1
UNION ALL
SELECT test.id,
cte.path || test.id,
test.family_id,
test.parent_id,
test.age
FROM test
JOIN cte ON test.parent_id = cte.id
)
SELECT id, path, family_id, parent_id, age
FROM cte
ORDER BY path;
结果,一个很好的表,由父母及其子女排序。
id | path |family_id | parent_id | age |
-------------------------------------------------
1 | 1 | 1 | 0 | 45 |
2 | 1,2 | 1 | 1 | 30 |
3 | 1,3 | 1 | 1 | 27 |
4 | 1,4 | 1 | 1 | 32 |
5 | 5 | 1 | 0 | 59 |
6 | 5,6 | 1 | 5 | 12 |
7 | 5,6,7 | 1 | 6 | 9 |
8 | 5,6,7,8 | 1 | 7 | 18 |
9 | 5,6,7,9 | 1 | 7 | 23 |
现在到了真正的挑战(太多头发拉出...)
应该怎样处理我的查询看起来像这样它 也种种每一个家长(和链接子女)按年龄(最高年龄第一)?
最终的结果应该是这样的:
id | path |family_id | parent_id | age |
-------------------------------------------------
1 | 5 | 1 | 0 | 59 |
2 | 5,6 | 1 | 5 | 12 |
3 | 5,6,7 | 1 | 6 | 9 |
4 | 5,6,7,8 | 1 | 7 | 23 |
5 | 5,6,7,9 | 1 | 7 | 18 |
6 | 1 | 1 | 0 | 45 |
7 | 1,2 | 1 | 1 | 32 |
8 | 1,3 | 1 | 1 | 30 |
9 | 1,4 | 1 | 1 | 27 |
该解决方案不工作:
ORDER BY path, age;
的演示是在SQL小提琴提供: SQLFIDDLE DEMO
此解决方案解决了我的问题。感谢您对代码的补充说明 –