在嘗試爲這個問題找到一個合適的解決方案並且幾乎將所有的頭髮都拉出來之後,我決定前來尋求幫助。按照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
此解決方案解決了我的問題。感謝您對代碼的補充說明 –