玩這個,我挑戰不足以解決問題,但我沒有足夠的挑戰,解決它在MySQL。考慮到這一點,這裏是你的問題的PostgreSQL的版本:
with recursive
skill_list(skill_id) as
(
select distinct skill_id from skill_req
where req is not null
union
select distinct req from skill_req
where req is not null
)
,skill_tree(skill_group, depend_on) as
(
select skill_id, skill_id -- seeds
from skill_list
union
select st.skill_group, sr.req
from skill_req sr
join skill_tree st
on sr.skill_id = st.depend_on
)
,skills_required as
(
select skill_group, depend_on
from skill_tree
where skill_group <> depend_on -- remove seeds
)
select
sl.skill_id,
array_agg(sr.depend_on order by depend_on) as array_version,
array_to_string(array_agg(sr.depend_on order by depend_on), ',')
as group_concat_version
from skill_list sl
left join skills_required sr on sr.skill_group = sl.skill_id
group by sl.skill_id
數據:
CREATE TABLE skill_req
(skill_id int, req int);
INSERT INTO skill_req
(skill_id, req)
VALUES
(2, 1),
(4, 3),
(5, 1),
(6, 4),
(6, 2),
(7, 6),
(7, 9),
(8, 2),
(8, 5),
(9, 3),
(10, 4),
(10, 5),
(10, 9);
輸出:
skill_id | array_version | group_concat_version
----------+---------------+----------------------
1 | {NULL} |
2 | {1} | 1
3 | {NULL} |
4 | {3} | 3
5 | {1} | 1
6 | {1,2,3,4} | 1,2,3,4
7 | {1,2,3,4,6,9} | 1,2,3,4,6,9
8 | {1,2,5} | 1,2,5
9 | {3} | 3
10 | {1,3,4,5,9} | 1,3,4,5,9
(10 rows)
現場測試:http://www.sqlfiddle.com/#!1/77894/1
如果沒有某種形式的存儲處理循環和遞歸地嘗試添加所有合格的過程,它不能在單個查詢a中完成你已經注意到,你永遠不知道數據會進入多少層次。 – DRapp
它不必在單個查詢中完成,我只需要一些技巧如何實現這個 – Tom
MySQL是一個需求?這對於支持CTE和窗口功能的數據庫來說很簡單http://stackoverflow.com/a/10395130 http://stackoverflow.com/a/10401572實時測試:http://www.sqlfiddle.com/#!1/db290/85 –