2013-04-18 2 views
0

각 하위의 상위 ID를 저장하는 간단한 계층 구조 테이블 '그룹'이 있습니다. MySQL은 계층 적 구조로 모든 레코드를 반환합니다.

나는 다음과 같은 쿼리 테이블 그룹의 각 구성원 쿼리하기 위해 노력하고있어 :

SELECT groups.name AS 'Group Name', 
     groups1.name AS 'Group1 Name' 
FROM groups 
     LEFT JOIN groups groups1 
       ON groups.id = groups1.parent_id 
WHERE groups.parent_id = 0 
ORDER BY groups.id, 
      groups1.id 

를 내가지고있어 :

| 그룹 이름 ......... ............................. | 그룹 1 이름 ............ |
| ----------------------------------------------- --------------------------- |
| 자산 .............................................. 고정 자산 .............. |
| 자산 .............................................. 현재의 자산 .......... |
| 자산 .............................................. 투자 | ....... |
| 부채 및 소유주 지분 ............ | 자본 계정 ......... |
| 부채 및 소유주 지분 ............ | 유동 부채 ...... |
| 결과 ............................................ | 직접 소득 ........... |

는하지만 내가 정말 원하는 것은 자식 즉,이 경우에도 각 노드에 대해 라인 :

| 그룹 이름 ................. ..................... | 그룹 1 이름 ............ |
| ----------------------------------------------- --------------------------- |
| 자산 .............................................. . | .................................. |
| 자산 .............................................. 고정 자산 .............. |
| 자산 .............................................. 현재의 자산 .......... |
| 자산 .............................................. 투자 | ....... |
| 부채 및 소유주 지분 ............ | .............................. ...... |
| 부채 및 소유주 지분 ............ | 자본 계정 ......... |
| 부채 및 소유주 지분 ............ | 유동 부채 ...... |
| 소득 ............................................ |. ................................. |
| 결과 ............................................ | 직접 소득 ........... |

쿼리 또는 쿼리와 관련하여이 작업을 수행 할 방법이 있습니까?

답변

0

최상위 항목에 parent_id를 0으로 설정하는 대신 parent_id를 자체 (즉, parent_id = id)로 설정하십시오. 그런 다음 최상위 레벨을 자신을 포함하는 모든 "하위"에 가입시킵니다.

SELECT parent.name AS `Group Name`, 
    IF(parent.id = child.id, '', child.name) AS `Group1 Name` 
FROM groups AS parent JOIN groups AS child 
    ON ((parent.id = child.parent_id))) 
WHERE parent.parent_id = parent.id 
ORDER BY parent.id, child.id 

적어도 하나의 "하위"가 있어야하므로 LEFT OUTER JOIN이 필요하지 않습니다.

또한 내가 스택 오버플로에 여러 게시물에 기술 한 폐쇄 테이블 디자인 사용할 수 있습니다

0

당신에게 몇 가지 추가 필드을 제공하는 접근 방식을하지만 필요 결과를 올바르게 주문하기 위해 그렇게하십시오. 출력을 조금 깔끔하게 정리하고 싶다면이 선택의 출력 주위에 다른 선택을 기술적으로 감쌀 수 있습니다.

(
    SELECT groups.id AS parent_id, groups1.id AS child_id, groups.name AS 'Group Name', 
     IF(LENGTH(groups1.name), groups1.name, '') AS 'Group1 Name' 
    FROM groups 
    LEFT JOIN groups groups1 ON groups.id = groups1.parent_id 
    WHERE groups.parent_id = 0 
) 
UNION 
(
    SELECT groups.id AS parent_id, NULL AS child_id, groups.name AS 'Group Name', '' AS 'Group1 Name' FROM groups WHERE groups.parent_id = 0 
) 
ORDER BY parent_id, child_id 
+0

최고의 - 위대한 작품을 내가 일 – user2296222

+0

멋진 :)이 진정으로 문제를 해결하는 경우 대답 함을 양해 해주십시오, 그것은 도움이 될 것입니다 승인 율이 고민하고 있었다 – Bryan

관련 문제