2012-09-05 4 views
2

내가 계층 구조로 구성 오브젝트의 테이블이 있다고 가정MySQL의에서 그래프/계층 적 데이터를 쿼리하는 방법

A 
|--B 
|--C 
| +--D 
+--E 

이들은 따라서 "부모 - 자식"테이블에 저장됩니다

parent child 
A  B 
A  C 
C  D 
A  E 

위에서 정의한 구조를 얻기 위해 어떻게 쿼리합니까?

object full_path 
A  NULL 
B  A 
C  A 
D  A.C 
E  A 

내가 개체가 깊은 하나 개 이상의 수준을 중첩하는 방법을 알아낼 수 없습니다 : 나는이 같은 정보를 생산하고 뭔가를 필요가 있다고 생각합니다. 그것은 테이블을 반복 할 필요가 있을지도 모른다고 느끼고 (SQL에서 가능한지 전혀 모른다), 전에는 결코 만나지 못한 쿼리를 사용한다.

추가 정보 :

  1. A는 유일한 고아 객체가 될 필요가 없습니다.
  2. 자녀가 여러 부모를 가질 수도 있지만 현재 해결하기 쉬운 시나리오에 대한 답변이 만족 스럽습니다. 다중 부모 구조체를 단순 부모 인 GROUP BYMIN 문으로 변환 할 수 있습니다.
+0

모든 항목, 단 하나의 부모가 있는가하면 데이터가 하나의 머리를 가지고있다 (즉, 만은 부모가없는 모든 항목은의 후손) 및 중간 테이블에 , A에게는 부모가 없다는 기록이 있습니까? – joocer

+0

수정 사항을 참조하십시오. A에는 부모가 없다는 레코드가 없지만 간단한 'left join'쿼리로 확인할 수 있습니다. – cammil

답변

-1

키 (varchar)가 있으면 정렬 할 수 있습니다. 당신은 MySQL은 함께 할 수 없습니다

001 
001.001 
001.001.001 
001.001.002 
001.001.003 
002 
002.001 
002.001 
003 
003.001 
... 
... 
+0

그래서 열쇠가 필요합니다. 그것을 어떻게 얻을 수 있습니까? – cammil

0

MySQL은 재귀 기능을 지원하지 않기 때문에하지만 당신은 무제한 깊이를 필요로하지 않는 경우에 당신은 자기 트리를 얻을 조인 사용할 수 있습니다 것처럼 키 값이 보일 것이다. 그렇지 않으면 프로그래밍 언어에서 재귀 함수가 필요하거나 하위 트리 선택을 쉽게하는 중첩 세트를 사용할 수 있습니다.

0

MySQL은 재귀 쿼리를 지원하지 않습니다. 그러나 하위 트리를 가져 오는 작업을 단순화하는 Nested Set을 사용할 수 있다면.

0

기본적으로 작동하지 않습니다!

루트 노드에 대한 정의가 필요합니다. 그런데 "나무"가 당신의 hierary 정의와 일치하지 않습니다.

parent child 
-  A 
A  B 
A  C 
C  D 
-  E 

마이너스 부모 항목이 루트 노드입니다 :

더 나은 방법이 될 것입니다. 그리고 이것은 당신의 나무를 반영합니다.

Sql은 계층 쿼리를 제공하지 않습니다.하지만 당신은 트릭 아 파크 반복 할 수

좋은 설명은 여기에서 찾을 수 있습니다 :

을 내가하려고 것 루트 노드를 찾는다. d 재귀를 사용하여 텍스트를 concat합니다.

루트 노드가 될 것입니다 :

SELECT * FRON objects WHERE parent = '-' 
+0

내 나무 다이어그램이 일치한다고 생각합니다! (아마 내 다이어그램이 비표준 임) – cammil

관련 문제