2011-09-28 3 views
3

계층 적 트리 모델을 만들기 위해 MySQL과 함께 중첩 세트 모델을 사용하고 있습니다.중첩 세트 모델 : 쿼리 노드 하위 노드는 1 단계 아래에 있고 상위 노드는 모두

나는 성공적으로 (만 1 하위 수준 내가 얻을 필요)

그러나, 나는 아래뿐만 아니라 모든 차일 1 레벨을하고 싶은 노드 아래의 모든 차일 1 수준을 얻기 위해 관리해야

있지만, 모든 그 노드 위의 부모들도.

내가 원하는 것을 얻기 위해 현재 쿼리를 수정할 수 있습니까?

내 코드입니다 (실제로이 아닌 작업, 사이트에서 가져온 것 : http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/하지만 내 정확히 동일) :

Electronics 
--Televisions 
----LCD 
--Portable Electronics 
----MP3 Players 
------Flash 
----CD Players 

:

SELECT node.name, (COUNT(parent.name) - (sub_tree.depth + 1)) AS depth 
FROM nested_category AS node, 
nested_category AS parent, 
nested_category AS sub_parent, 
(
    SELECT node.name, (COUNT(parent.name) - 1) AS depth 
    FROM nested_category AS node, 
    nested_category AS parent 
    WHERE node.lft BETWEEN parent.lft AND parent.rgt 
    AND node.name = 'PORTABLE ELECTRONICS' 
    GROUP BY node.name 
    ORDER BY node.lft 
)AS sub_tree 
WHERE node.lft BETWEEN parent.lft AND parent.rgt 
AND node.lft BETWEEN sub_parent.lft AND sub_parent.rgt 
AND sub_parent.name = sub_tree.name 
GROUP BY node.name 
HAVING depth <= 1 
ORDER BY node.lft; 

트리 구조는 다음과 같습니다 위의 코드를 사용하면 다음과 같이 나타납니다.

--Portable Electronics 
----MP3 Players 

하지만 저는 S : 너무

Electronics 
--Portable Electronics 
----MP3 Players 

내가 PHP 나중에이 쿼리를 사용하는 것, 그래서 PHP 기반 솔루션 (또는 그것의 일부)를 사용할 수 있습니다.

고맙습니다.

답변

0

여러 개의 쿼리로 분할하려고합니다. 먼저 '포터블 일렉트로닉스'항목을 자녀와 함께 사용하십시오. 그 후, 부모님을 가져 오는 것은 쉽습니다. 단지 모든 요소를 ​​가져옵니다. WHERE left < [PE-left] AND right > [PE-right].

+0

그런데 어떻게 가입합니까? SQL UNION? 그것을 시도했지만 성공하지 못했습니다. 누군가에게 몇 가지 예가 있을지도 모릅니다. 감사. – Andrew

0

여러 쿼리를 사용하여 문제를 해결할 수있었습니다.

첫 번째 쿼리는 노드 위의 모든 부모 (Rijk 제안)를 검색하고 두 번째 쿼리는 노드 아래의 모든 항목 (코드, 원래 게시물에 게시 됨)을 검색합니다. 그런 다음 UNION ALL을 사용하여 모든 결과를 하나의 결과 집합으로 결합했습니다.

그러나 내가 그렇게 차일 페이지의 형식화하는을 만들기 위해, 더 이상 들여 쓰기를 만들기 위해 깊이 열을 사용하지 수, 난 들여 쓰기 노드 (http://www.sitepoint.com/hierarchical-data-database-2/)

참고 PHP 기반 기능을 사용 : 내가 추가했다/else 문 경우 이 코드의 끝에는 부모 노드 만 들여 쓰고 모든 것을 들여 쓰지 않아야합니다.

0

같은 문제가있었습니다. 이것은 작동하는 것처럼 보였다.

SELECT parent.name 
FROM nested_category AS node,nested_category AS parent,nested_category AS midpoint 
WHERE (node.lft BETWEEN parent.lft AND parent.rgt) AND (node.lft BETWEEN midpoint.lft AND midpoint.rgt) AND midpoint.name='PORTABLE ELECTRONICS' 
GROUP BY parent.name 
ORDER BY node.lft; 
관련 문제