2013-07-03 2 views
2

여기에서 많은 부분을 검색 한 후에도 문제를 해결할 수 없습니다. 그래서, 나는이 질문을 올리고있다.mysql의 동일한 테이블에서 부모 자식을 선택하십시오.

내가 이런 구조가 데이터베이스 테이블이 있습니다

folder_id folder_name parent_id 
-------------------------------------- 
    1   Private   0 
    2   Public   0 
    3   Photos   0 
    4   December   3 
    5   Bday    4 
    6   Celeb   5 

계층 형태에서를이 폴더 구조와 같은 것입니다 : 이제

-- Private 
-- Public 
-- Photos 
----- December 
-------- Bday 
----------- Celeb 

, 나는를 선택하고 싶습니다 특정 폴더까지의 경로 (예 : BAYAY 또는 Celeb 폴더). 따라서 특정 폴더의 경로 사이에 폴더가있는 행만 반환하는 MySQL 쿼리가 필요합니다. 내가 명사 폴더의 경로를 원하는 경우

예를 들어, 다음 쿼리는 이러한 행 반환해야합니다 : 현재

folder_id folder_name parent_id 
-------------------------------------- 
    3   Photos   0 
    4   December   3 
    5   Bday    4 
    6   Celeb   5 

,이 쿼리 붙어 그리고 난 그것을 만들 수 없습니다입니다 작업. 쿼리 나는 현재 노력하고 있어요 :

SELECT f.* 
FROM fd_folders f 
LEFT JOIN fd_folders p 
ON f.folder_id = p.parent_id 
WHERE f.folder_id <=6 
ORDER BY f.folder_id; 

을하지만, 문제는 그것은 또한 즉, 두 개의 다른 폴더를 반환하는 것입니다, 개인 및 공공.

도와주세요.

은 직접 귀하의 질문에 대답하지 않더라도 난 그냥이 게재됩니다 당신에게

안부

+0

당신은 재귀가 필요하다고 생각합니다. 아무도 그때까지 도와 줄 수 없다면 이전 스크립트를 찾을 수 있는지 보겠습니다. –

+0

은 다음과 같아야합니다. ON p.folder_id = f.parent_id –

+0

그리고 처리하기 위해 저장 프로 시저를 작성해야합니다. 재귀 쿼리를 실행하려면 ... –

답변

1

감사드립니다. http://www.sitepoint.com/hierarchical-data-database-2/

이 일부 올바르게 설정하려면와 함께 연주하고, 재미 처리되지 않습니다 새로운 데이터를 삽입 걸릴 것입니다 : 당신은 계층 적 데이터를 가지고 테이블을 설정 할 수 있습니다처럼

는 것 같습니다. 결과를 처리하는 추가 언어를 사용하면 인생이 훨씬 쉬워 질 수 있습니다.

대신 mysql이 아닌 SQL Server를 사용할 수 있다면이 모든 작업이 실제로 매우 간단 해집니다.

은 유감스럽게도, MySQL은이 기능을 지원하지 않습니다

;WITH DirectoryTree (folderId, folderName, parentId) 
AS 
(

    SELECT d.folderId, d.folderName, d.parentId 
    FROM zzz_Directories d 
    WHERE d.folderId = 4 -- target folderId 

    UNION ALL 

    SELECT d.folderId, d.folderName, d.parentId 
    FROM zzz_Directories d 
    INNER JOIN DirectoryTree dt ON dt.parentId = d.folderId 

) 

SELECT dt.folderId, dt.folderName, dt.parentId 
FROM DirectoryTree dt 

(의도적 세미콜론) : 당신은 공통 테이블 식을 필요로한다. 대신 주석에서 제안한 내용을 수행해야 할 수 있습니다. 저장 프로 시저를 사용하십시오. 이 테스트까지 나는 환경을 가지고 있지 않지만, 나는 그런 절차는 두 부분으로했을 상상 : 나에게 UNION를 돌려, 내 부모가 0이 아닌 경우, 내 부모가 0이면

  1. 이 나에게
  2. 을 반환을 프로 시저

프로시 저는 부모 = 0이 될 때까지 간단히 재귀 적으로 자신을 호출합니다.이것이 가능할 지 모르겠지만 시작할 장소입니다.

관련 문제