2017-05-10 10 views
1

나뭇잎의 루트를 선택하는 방법 나는이는 하나의 테이블에 MySQL

id , parent_id , name  , leaf 
1 , 0   ,parent 1 , 0 
2 , 0   ,parent 2 , 0 
3 , 1   ,child 1 , 0 
4 , 3   ,child 2 , 1 
5 , 2   ,child 3 , 0 
6 , 5   ,child 4 , 1 
7 , 0   ,child 5 , 1 

같은 테이블이 그리고 난 잎을 선택하여 원하는 루트 이름이 아닌 부모 이름을 같은 뭔가 그것은`아래

id , name  , root_name 
4 , child 2 , parent 1 
6 , child 4 , parent 2 
7 , child 5 , null 

세 명이 여러 레벨을 가질 수 있습니다 MySQL에서 저장 프로 시저를 사용하여 어떻게 할 수 있습니까?

+0

아래 요구하려면 출력과 같은 일을 할 수 있습니다. 선택은 sproc 작성, 응용 프로그램 코드에서의 논리 처리, 필요에 따라 자주 테이블에 참여 또는 다른 모델로 전환하는 등의 작업을 포함합니다. 중첩 세트. 이 모든 주제는 다른 곳에서도 널리 논의되어 있으므로 여기서는 자세히 설명하지 않겠습니다. – Strawberry

답변

0

IMO이 경우 두 개의 테이블이 있어야합니다. 하나는 노드에 대한 것이고 다른 하나는 노드 관계에 대한 것입니다. 그런 다음 합류하여 원하는 결과를 얻을 수 있습니다.

Database normalization에 대해 읽고 왜 중요한지, 당신은 3 정규형까지 DB를 정상화 수 있습니다.

nodes (
    id, 
    name 
) 

node_to_parent (
    id 
    node_id, 
    parent_id 
) 

그럼 당신은 다음과 같이 조회 할 수 있습니다

Select n.name, np.parent_id from nodes 
join node_to_parent np 
on np.node_id = n.node_id; 
+0

응답 해 주셔서 감사합니다. 어떻게 저장 프로 시저를 사용하여 잎의 root_node 만 선택할 수 있습니까? –

1

당신은 당신은 MySQL이 현재 재귀을 지원하지 않는다는 점을 관찰 할 것이다

select t.id, t.name, m.root_name from (select id,parent_id,name,leaf from urtable where leaf=1) t 
join urtable m on (t.parent_id=m.parent_id and t.id=m.id)