2011-12-05 4 views
1

나는 Likes (uid1이 uid2를 좋아한다)의 테이블을 가지고 있으며 특정 userID (uid)를 갖기 때문에 그를 좋아하는 사람이나 그를 좋아하는 사람을 찾아야합니다. 등등.likes 계층 구조를 찾을 재귀 SQL

with recursive Hierarchy(uid, Level) 
as 
(
    select 
     uid1 as uid, 1 as Level 
    from 
    Likes l 
    where 
    l.uid2 = 1 --parameter will go here 
    union all 
    select 
     l.uid1, lh.Level + 1 
    from 
     Likes l 
    inner join Hierarchy lh 
     on l.uid2 = lh.uid 
    where l.uid1 not in (select uid from Hierarchy) --this is wrong syntax in postgresql 
) 

select * from Hierarchy 

테이블에서 다음 값을 주어진 예를 들어 따라서 (

2,1 (2 likes 1) 
3,1 (3 likes 1) 
4,1 (4 likes 1, 1 is popular) 
3,4 (3 likes 4) 
4,3 (4 likes 3) 

이 좋아하는 계층 구조 원이 좋아, 나는 항목 만하지에게 이전 반복을 추가하고 싶어 할 때 문제가 나타납니다 NOT IN).

새로운 uids를 추가 할 때만 제한을 삽입 할 수 있습니까? 이 템플릿을 기반으로

+0

짧은 RTFM 후 postgresql 설명서에서 설명을 찾았습니다. http://www.postgresql.org/docs/8.4/static/queries-with.html – Bg1987

+1

해결책이있는 경우 게시하십시오. 대답은 단지 문서를 참조하지 마십시오. –

+0

정확히 무엇이 질문입니까,주기적인 참조를 금지하는 "제약 조건"을 원하십니까? 삽입시 수행 할 수 있습니다. 제약으로도 할 수 있지만 아마도 카나리아 테이블이 추가로 필요할 것입니다. – wildplasser

답변

1

:

WITH RECURSIVE search_graph(id, link, data, depth, path, cycle) AS (
     SELECT g.id, g.link, g.data, 1, 
      ARRAY[g.id], 
      false 
     FROM graph g 
     UNION ALL 
     SELECT g.id, g.link, g.data, sg.depth + 1, 
      path || g.id, 
      g.id = ANY(path) 
     FROM graph g, search_graph sg 
     WHERE g.id = sg.link AND NOT cycle 
) 
SELECT * FROM search_graph; 

(http://www.postgresql.org/docs/8.4/static/queries-with.html)

당신이 얻을 :

with recursive Hierarchy(uid, Level, path, cycle) 
as 
(
    select 
     uid1 as uid, 1 as Level, ARRAY[l.uid], false 
    from 
    Likes l 
    where 
    l.uid2 = 1 --parameter will go here 
    union all 
    select 
     l.uid1, lh.Level + 1, 
     path || l.uid, 
     l.uid = ANY(path) 
    from 
     Likes l 
    inner join Hierarchy lh 
     on l.uid2 = lh.uid 
) 

select * from Hierarchy 
관련 문제