2011-02-16 3 views
1

"제품"테이블에 모든 제품 세부 정보가 있습니다.
계층 구조로 표시하는 방법,

product_id product_type_id internal_name 
1001  finishedgood   nokia 
1002  rawmaterial   chip 
1003  subassembly   diaplay 
1004  rawmaterial   displaybase 

그것은 노키아 휴대폰 (finishedgood)이 회사

칩 (rawmaterial), 디스플레이 (조립체)을 필요로하게하는 것을 의미한다. 다시
이제

"productassoc"테이블 세부
(rawmaterial)
displaybase 필요 디스플레이 (서브 어셈블리)를 만들기 위해

product_id product_id_to 
    1001   1002   
    1001   1003   
    1003   1004  

내 질문 : 내가 노키아는

제조에 필요한 모든 개체를 가져 오지하려면

이 쿼리는 레벨 1 상품이 필요합니다. (
서브 어셈블리에도 필요한 원자재를 표시하고 싶습니다.)

쿼리

select pa.product_id,pa.product_id_to,p.product_type_id,p.internal_name 
     from product p, 
     product_assoc pa 
     where p.product_id=pa.product_id_to and pa.product_id=1001 

O/P 나 또한 서브 어셈블리에 필요한 기초 원료를 표시 할

product_id product_id_to product_type_id  internal_name 
    1001   1002   rawmaterial   chip 
    1001   1003   subassembly   display 

-----
.

의미, 내 쿼리
finishgood 수 있도록 필요한 모든 rawmaterials 및 하위 어셈블리를 반환해야합니다. 또한 서브 어셈블리에 필요한 원재료도 있습니다.

이것은 단지 샘플입니다. 나는 제품에 대해 약 100 가지 구성 요소를 가지고있었습니다.

+0

희망이 도움이 될 수 있습니다 http://stackoverflow.com/questions/11064913/achieve-hierarchy-parent-child-relationship-in-an - 효과적이고 쉬운 방법 –

답변

0

나는

이 확인 "건설"같은라는 컬럼을 추가하는 것이 좋습니다 것입니다 그것은 전체 체인 될 것이다 적어도 VARCHAR (255) 또는 당신이 필요합니다 값을 유지하기 위해 필요하다면 더 큰, 부모로부터 물건의 건설에 사용 된 제품 자체에 이르기까지.

제품 번호의 길이가 항상 같은지 확인하십시오. 그렇지 않은 경우 LPAD에 0과 공백이 있으면 사용하십시오. 기존의 데이터에서 이러한 구성 문자열을 빌드하고 일부 문자로 결합 된 스크립트로 채우십시오 (예 : ':').

이 당신에게 당신의 데이터에서 같이 값을 줄 것이다 : 이것은에 정렬하면 쉽게 열을 제공

product_id product_type_id internal_name construction 
1001  finishedgood   nokia  1001 
1002  rawmaterial   chip  1001:1002 
1003  subassembly   diaplay  1001:1003 
1004  rawmaterial   displaybase 1001:1003:1004 

합니다. 그런 다음 테이블에 대한 모든 INSERT가이 논리를 따르는 지 확인하십시오. 이것의 재미있는 부분은

SELECT * 
    FROM product 
    WHERE construction LIKE '1001%' 
ORDER BY construction 

당신이 당신의 retrival 스크립트에서 "깊이"를 결정하기 위해 콜론의 개수를 카운트 할 수있다 :

그냥 WHERE 절에 LIKE를 사용,이에서 선택 제품의 이렇게하면 출력 등을 쉽게 포맷 할 수 있습니다.예를 들어, mod_perl을 처리기 출력 HTML에 당신이 말할 수 있습니다

while (my $p = $get_parts->fetchrow_hashref) { 
    $r->print("<li style='text-indent: @{[scalar @{[($p->{construction} =~ /:/]} * 5]}em'>$p->{product_id}: $p->{internal_name} ($p->{product_type_id})</li>"); 
} 
관련 문제