2012-01-22 4 views
1

나는 foo라는 db 테이블을 가지고있다. 그것은 다음 필드가 있습니다중첩 된/재귀적인 MySQL 쿼리

  • ID를
  • 이름
  • parentId

그것은 다음과 같이 아래로 3 단계 깊이 갈 수

  • 푸 1 (parentId : 0)
    • Foo 2 (부모 아이 1) (foo의 자녀 1),210
      • 푸 3 (parentId는 : 2) (모두 foo1은과에서는 foo2의 자식)

지금 문제가 내 사용자 테이블에서 필드있다되고 fooId을했다. 최상위 foo에 속한 모든 사용자를 얻고 싶습니다.

예를 들어, 사용자의 fooId가 3이고 위의 예에서 fooId1과 관련된 모든 사용자를 얻으려면 해당 사용자가 결과에 포함되어야합니다.

그냥 두 가지 수준의 깊은 있었다면, 나는 이런 식으로 뭔가를 할 수 :

`SELECT stuff FROM users, foo WHERE foo.parentId = '1' AND user.fooId = foo.id 

하지만 그것은 현재의 상황에서 어떻게 할 수 있습니까?

+0

다음은 도움이 될 수 http://stackoverflow.com/questions/5291054/hierarchical-sql-problem/5291159#5291 159 –

답변

1

내 논리가 여기에 몇 가지 점에서 엉망이되어 있는지 확인 해요 ...하지만이 같은 수 있음 올바른 방향

SELECT stuff 
FROM users, foo 
WHERE (foo.parentId = '1' AND user.fooId = foo.id) 
OR user.fooId IN (
    SELECT fooid from foo where parentID IN (
    SELECT fooid from foo where parentID = '1' 
) 
) 
+0

한눈에 이것은 잘 돌아갈 것입니다.하지만 확장 성이 좋지 않을 것이라고 생각합니다. 따라서 가능한 ID 수에 달려 있습니다. [중첩 세트 모델 (Nested Set Model)] (http://www.fliquidstudios.com/2008/12/23/nested-set-in-mysql/)은 훨씬 더 효율적이지만 아마도 유지 관리 작업을 수행 할 수 있습니다. 적절한 트리거는 대개 해당 문제를 처리 할 수 ​​있습니다. – Ilion

+0

나는 이것이 성능면에서 큰 효과가 없다는 것에 동의해야합니다. 이것은 보이지만 이것은 일종의 관계 테이블을 통해 실행되어야합니다. 마찬가지로 자체 참조 habtm 협회 –

1

에 당신을 얻을 수 ...

SELECT stuff FROM users, foo WHERE foo.parentId = '1' AND user.fooId = foo.id UNION SELECT stuff FROM users WHERE fooId = '3'

편집 : 이 SELECT stuff FROM users, foo WHERE foo.parentId = '1' AND user.fooId = foo.id UNION ALL SELECT stuff FROM users WHERE fooId = '3'

+0

FooID # 4가 fooid # 2의 자식 인 경우 –

+0

이 'UNION'을 'UNION ALL'으로 바꾸면이 작업이 수행되지 않습니다. – sally

+0

이것은 여전히 ​​' 다른 Foo의 계정입니다. 이것은 OP에 의해 예제로 주어진 것에 정적입니다. 다시 말하지만 Foo2에 Foo4 또는 Foo5가있는 경우이 쿼리는 Foo3 만 가져옵니다. 또는 Foo1에 Foo6 자식이 주어지면 트리는 다시 고장납니다. –