2011-02-16 111 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>"); 
}