2011-02-16 135 views
1

我有「產品」表,它包含所有產品的詳細信息。
如何在層次結構中顯示,,

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

;那意味着把諾基亞手機(finishedgood)公司需要

芯片(原材料),顯示器(組件)。使顯示器(組件),它需要再次
displaybase(原材料)

現在 「productassoc」 表的詳細信息

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 

-----
我想顯示所需的子組件還rawmaterials。

意思是說,我的查詢應該返回完成所需的所有原材料和子組件。以及部件所需的原材料。

這只是一個示例。我有一個產品約100個組件。

+0

希望這可能是有用的:http://stackoverflow.com/questions/11064913/achieve-hierarchy-parent-child-relationship-in-an - 有效和寬鬆路 – 2013-07-01 08:17:18

回答

0

我會建議增加一個名爲類似「建設」

請列其至少一個varchar(255),或者如果需要保存,你需要的值越大,這將是完整的鏈條從父母到產品本身用於建造事物。

請確保您的產品編號始終是相同的長度(或者如果不是,則使用零或空格LPAD),然後用一個腳本填充這些構造字符串從現有數據中加入一些字符(':', 例如)。

這將使你的樣子,從你的數據值:

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都遵循這個邏輯。

從這個選擇,只使用一個像WHERE子句中:

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

這樣做的有趣的部分是你可以在你的retrival腳本,算上冒號的數量確定的「深度」的產品。這使得格式化輸出等變得容易。例如,在一個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>"); 
}