2012-07-31 4 views
1

중첩 세트 모델의 하이브리드를 사용하여 하위가 여러 부모를 가질 수 있도록합니다. Mike Hillyers 블로그에 설명 된 중첩 세트 모델의 확장입니다 : http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ - 일부 열 이름을 설명하는 데 도움이됩니다.다른 쿼리 결과 사용

저는 SQL에 상당히 익숙하지만 조인, 하위 쿼리 등을 조사 했으므로 필요한 결과를 제공하지 못하는 것 같습니다. 대답은 상당히 간단하지만 거의 확실하게 LEFT JOIN이 될 것이라고 기대합니다. 그러나 그것에 손가락을 대지 못했습니다.

'tree_id', 'part_id', 'lft', 'rgt'및 'mapping'5 개의 열이있는 'nested_parts'라는 간단한 테이블이 있습니다.

다음 쿼리는 두 번째 쿼리에서 비교할 값을 반환합니다.

SELECT * FROM nested_parts WHERE part_id = 125 

특히, 이제는 tree_id의 해당 부품 # 125가 있고 각 tree_id의 lft 및 rgt 값을 알고 있습니다.

이제 이전에 가져온 tree_id 결과의 배열에있는 모든 part_id를 알아야합니다.

SELECT * FROM nested_parts 
WHERE tree_id = ANY (SELECT tree_id AS tbl FROM nested_parts WHERE part_id = 125) 

지금 내가의 각 tree_id의 범위 내에서 부품 번호 (125)의 LFT와 RGT 값 사이에없는 LFT와 RGT 값이 part_id 알아야합니다 :

나는이 이것에 대한 하위 쿼리 사용 . 두 테이블을 비교할 테이블이 있거나 가상 테이블을 사용할 수는 있지만 루프 없이는 불가능합니다.

감사의 말을 전한 모든 도움을 받았지만 게으르지 않고 바보가 아니며 내가 유니온, 조인스, 도움, 어디에서 선택 (선택), 위에있는 데이터의 복잡성에 대해서 충분히 읽었지만 이것은 매우 혼란 스럽다.

종류와 관련,

제임스

+0

이봐 제임스, 당신은 설정할 수 있습니다 sqlfiddle @ 조인도 조건을 결합 할 수 있습니다 귀하의 질의 : http://sqlfiddle.com/ –

+0

이 훌륭한 질문입니다 거기에서 끝에 약간 혼란스럽게 말했지만. – Matt

+0

PHP 태그를 제거했는데 PHP에서 구현하고 있지만 기본적으로 mysql 질문입니다. – Matt

답변

1

나는 당신의 데이터 아키텍처를 재 방문하는 것이 좋습니다 동안, 나는 당신이 해결이 특정 문제를 얻을 수 있도록 노력하겠습니다.

먼저 JOIN을 다시 방문해 보겠습니다. 귀하의 질의

SELECT * FROM nested_parts WHERE tree_id = ANY (SELECT tree_id AS tbl FROM nested_parts WHERE part_id = 125) 

내가 더 완벽하게 내가 질문을 읽고 완료하고 완전히 이해 한 후 조금 대답하는 JOIN

SELECT np.* FROM nested_parts AS np 
INNER JOIN nested_parts AS np2 
ON np.tree_id = np2.tree_id 
AND np2.part_id = 125 

단순화 할 수있다. 나는 이것이 지금 도움이되기를 바랍니다.

UPDATE :

RGT LFT와 값은 부품 번호 125에서 값이 LFT와 RGT 사이에없는 레코드 만, 당신은을 사용해야 얻기 위해 HAVING 조건.

SELECT np.* FROM nested_parts AS np 
INNER JOIN nested_parts AS np2 
ON np.tree_id = np2.tree_id 
AND np2.part_id = 125 
HAVING np.lft > np2.rgt 
    AND np.rgt < np2.lft 

내 논리가 좋지 않다면 알려주십시오. I 생각해 보면입니다.

편집 :

SELECT np.* FROM nested_parts AS np 
INNER JOIN nested_parts AS np2 
ON np.tree_id = np2.tree_id 
AND np2.part_id = 125 
AND np.lft > np2.rgt 
AND np.rgt < np2.lft 
+0

당신은 신사이고 학자입니다. 도와 주셔서 정말 감사합니다. 유사한 조인을 시도 했었지만 np. *와 AS를 함께 사용할 수 있는지, 셀프 조인의 두 번째 부분에서 AND를 사용하여 실제로 실제로 사용할 수 있는지조차 알지 못했습니다. 논리를 변경하기 위해 마지막 값을 사이에 그냥 반전하지만 당신의 대답은 완벽했습니다. NP는 INNER np.tree_id = np2.tree_id AND np2.part_id = 125 AND np.lft np2.rgt ON AS NP2 nested_parts 가입 SELECT NP. * nested_parts FROM AS –

+0

@JamesPitt 이런 젠장, 그 일 했니?! 방금 어둠 속에서 총에 맞았 어! – Matt

+0

@JamesPitt 모든 진지함에도 불구하고, 무슨 일이 벌어지고 있는지 이해하고 있습니까? – Matt