2012-01-15 5 views
0

EDIT : 일부 답변을 읽은 후 재귀가 필요하지는 않지만 일부 쿼리는 트리와 함께 작동합니다. 나는 현재 알고 있지 않은 기본 개념과 적절한 방법을 제공하는 다음 게시물 http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/을 읽고있다. 고마워, 게시 된 링크를 계속 읽으겠습니다.SQL recursive : 트리의 주어진 노드에서 모든 자식을 선택하십시오.

저는 모든 노드가 하위 노드를 가질 수있는 트리에서 작업하고 있습니다. 모든 노드는 그 부모를 참조하기 위해 자식에 의해 자체 생성 된 node_id를가집니다. 간단한 테이블 예는 수 다음

 
CREATE TABLE IF NOT EXISTS `arbres` (
    `node_id` int(11) NOT NULL AUTO_INCREMENT, 
    `pare_id` int(11) DEFAULT NULL, 
    PRIMARY KEY (`node_id`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=470 ; 
ALTER TABLE arbres ADD CONSTRAINT FK_E6A4F221A4467B16 FOREIGN KEY (pare_id) REFERENCES arbres(node_id) ON DELETE CASCADE; 

내가 뭘 노력하고있어 모든 어린이를 선택할 수 있습니다 등등, 내가 차일의 차일, 차일의 차일을 의미 쿼리를 찾을 수 있습니다 하위 쿼리 등을 한 번에 조회 할 수 있습니다. 나는 좋은 생각이 아닌 다중 문장의 SQL 문장으로 그것을 수행 할 수 있도록 SQL에 매우 익숙하다. 너의 시간 동안 Thx.

+1

어쩌면 다음과 같이 시작할 수 있습니다. http://stackoverflow.com/q/1323245/535275 –

+0

MySQL은 재귀 쿼리를 지원하지 않습니다. PostgreSQL이나 Firebird (또는 상업용 데이터베이스)와 같은 재귀 쿼리를 지원하는 DBMS로 "업그레이드"하거나 데이터 모델을 변경하는 저장 프로 시저를 만들어야합니다 –

+1

다음 답변을 확인하십시오 http : /stackoverflow.com/questions/5291054/hierarchical-sql-problem/5291159#5291159 –

답변

0

가장 좋은 방법은 노드별로 트리를 탐색하는 것입니다. 트리가 얼마나 많은 레벨을 가지지 않으므로, 하나의 쿼리를 찾는 것은 아마도 좋은 습관이 아닙니다. 루트를 가정 한 것입니다

select node_id from arbres where pare_id = 1 

1 = pare_id 그런 다음 반환 된 모든 노드에 대해 같은 일을한다 :처럼 주어진 부모에 대해 여러 번 아이들을 반환 한 조회 또는 프로 시저를 가지고 아무 문제가 없습니다. 노드가 반환되지 않으면 마지막 노드가 잎임을 알 수 있습니다.

당신이 정말로 한 쿼리에서이 모든 것을 달성해야하는 경우

단순히
select * from arbres 

을 그리고 지금 당신이 사용하는 언어를 프로그래밍하는 트리를 reconstrut.

+0

"하나의 쿼리를 찾으려고 시도하는 것이 아마도별로 좋지 않을 것입니다. *". 이것은 MySQL에만 해당됩니다. 다른 DBMS를 사용하면 단일 쿼리에서 이런 종류의 작업을 매우 쉽고 효율적으로 수행 할 수 있습니다. –

+0

필자는 재귀 쿼리 기능을 한번도 사용하지 않았지만이 경우 적합하지 않다고 생각되는 중첩 쿼리 만 사용한다고 말해야합니다. – emt14

+0

다음을 확인하십시오. http://stackoverflow.com/questions/3307480/postgresql-reursive-with http://stackoverflow.com/questions/584904/cte-to-traverse-back-up-hierarchy –

관련 문제