2016-07-09 11 views
0

여러분 중 일부는 MySQL 전문가가 저를 도울 수 있기를 바랍니다.mysql은 중첩 된 설정 트리에 대한 특수 데이터 만 가져옵니다.

트리에 간격이 있으면 더 깊은 아이들을 원하지 않습니다.

예 :

id | parent_id | lft | rgt | depth | title 
: 깊이 3 노드가 비활성화 인 이때

root (depth 0) 
sub-cat 1 (depth 1) 
subsub-cat 1 (depth 2) 
subsubsubsub-cat 1 (depth 4) 

내가 노드 subsubsubsub 고양이 1 깊은

구조를 필요로하지 않는다

기본 검색어 :

select * 
from categories 
where lft >= '1' and lft < '10000' 
order by lft asc 

고마워요!

+0

중첩 된 세트가 이렇게 존재합니다 hidden, 만은 숨겨진 전임자가없는 (또는 자신을 숨겨) 그 노드를 사용 두 숫자 사이에서, 그것은 갭에 대해별로 신경 쓰지 않는다), 그렇게 쉽게 (가능하게) 가능하지 않다. 노드를 삭제할 때 모든 자식을 삭제하면됩니다 (표준 중첩 세트 알고리즘에서 발생해야 함). 어떤 이유로 노드를 보존하려면 다른 숨겨진 (하위) 트리로 이동하거나 열을 추가 한 다음 삭제하지 말고 사용되지 않거나 숨겨진 것으로 표시하십시오. – Solarflare

+0

고마워, 어쩌면 불가능하지만, 나는 카테고리를 삭제하고 싶지 않다. 나는 부모 카다로그가 비활성화되어 있다면 아이들을 숨기고 싶다. 예 : 의류> Mens> 청바지> Slim 청바지를 사용하지 않으면 나무에 슬림 보이지 않음. – Tom

+0

노드가 비활성화되어 있는지 어떻게 알 수 있습니까? – Strawberry

답변

0

갭 ("삭제 된 중간 노드"에서와 같이 값이 누락되었거나 depth 값이 뛰어남)은 중첩 된 세트에서 감지하거나 정의하기가 어렵습니다 (이러한 열은 중첩 세트에 필요하지 않습니다). 그러나 노드와 모든 자식을 숨기려면 트리에 마커 열을 추가하면됩니다. 그냥 모든 노드를 취할 것 (특수 물건에 대한 전체 경로를 확인하지 않아도

select * 
from categories as node 
where not exists 
    (select 1 from categories as preds 
    where node.lft >= preds.lft 
     and node.rgt <= preds.rgt 
     and preds.hidden = 1) 
order by node.lft; 
+0

위대하고 완벽하며 대단히 감사합니다! – Tom

+0

하나 더 질문 : 어쩌면 당신은 어떻게 검색 결과에 대한 조상 노드를 얻을지 모른다. 예. Slim에서 슬림 한 청바지를 발견하면 조상만을 보여줍니다. Clothes> Mens> Jeans>. 그래서 결과가 하나 뿐이므로 노드 만 표시 의류> Mens> Jeans> Slim. – Tom

+0

@ 예 예, 해당 경로를 검색하는 것은 중첩 된 집합에 대한 완전히 표준적인 쿼리입니다. [MySQL의 계층 적 데이터 관리] (http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/) (깊이와 parent_id도 계산할 수있는 예제가 있으므로, – Solarflare