2014-04-12 2 views
0

부모/자식 관계 구조가있는 테이블이 있습니다.단일 ID를 기반으로 모든 행을 얻는 방법

  1. 실제 위치 (유형 = 1)
  2. 하위 그룹 (유형 = 10)
  3. 헤드 그룹 (유형 = 100)

:

엔티티의 3 종류가 있습니다 예제 구조

id parent name      type 
28 0  Head Group     100 
10 28  --Location 1    1 
12 28  --Location 2    1 
16 28  --Location 3    1 
17 28  --Location 4    1 
19 28  --Location 5    1 
29 28  --Location 6    1 
8 28  -Sub Group 1    10 
11 8  --Sub Group 1 Location 1 1 
30 28  -Sub Group 2    10 
13 30  --Sub Group 2 Location 1 1 
14 30  --Sub Group 2 Location 2 1 
15 30  --Sub Group 2 Location 3 1 

1d28 (헤드 그룹)이 전달 된 경우 모든 행을 선택하십시오.

나는 진술을 만들려고 노력했지만 이것이 나를 넘어선 것 같습니다. 어떤 도움을 주시면 감사하겠습니다 ...

SELECT CGroup.id, 
    CGroup.parent, 
    CGroup.name, 
    CGroup.type 
FROM Customer AS CGroup 
INNER JOIN Customer AS CSubGroup 
    ON CSubGroup.parent_id = CGroup.id 
WHERE CGroup.parent_id=28 
+0

쿼리 결과를보고 싶습니까? – Hamidreza

+0

여기에서 중요한 질문은 계층/상속의 수준 수에 상한값이 있습니까? 아니면 n 수준으로 일반화해야합니까? 예를 들어, 3 레벨보다 깊지 않을 것이라는 확신이 들면 쿼리가 쉽습니다. n 레벨이라면 코드 나 저장 프로 시저가 필요합니다. – RobP

+0

현재 2 레벨 밖에 없으며 그게 전부입니다. –

답변

1

너무 복잡합니다. 단순하게 유지하십시오. 간단한 쿼리는 대개 빠르게 실행되고 버그가 적습니다.

// first get all subgroups under the main group 
subGroupIds = fetchField(' 
    select group_concat(id) 
    from CGroup 
    where parent = 28 
    and type = 10 
') 

// then get everything 
results = fetchRows(' 
    select * 
    from CGroup 
    where parent = 28 
    or parent in (subGroupIds) 
') 

당신이 정말하고 싶은 경우

"제대로"나는 Nested Set tree를 구현하는 것이 좋습니다.

+1

+1을 주시면 'less'보다는 'less bugs'라고 말하게 해드릴 것입니다. 걱정 마라, 나는 내가 어리 석다는 것을 안다. ;) – paqogomez

+0

@paqogomez 저의 답을 수정하여 자유롭게 다음과 같이 수정하십시오 : p –

+0

나는 그다지 많은 엉덩이가 아닙니다. :) 좋은 답변. – paqogomez

관련 문제