如何在层次结构中显示,,

时间:2011-02-16 09:50:13

标签: mysql

我有“产品”表,它包含所有产品详细信息。

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

这意味着让诺基亚手机(成品)公司需要

芯片(原材料),显示器(子组件)。再次显示(子组件)需要
显示基础(rawmaterial)

现在“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

- - - -
我想显示子组件所需的原材料。

意味着,我的查询应该返回完成所需的所有原材料和子组件。以及子组件所需的原材料。

这只是一个样本。我有一个产品的大约100个组件。

1 个答案:

答案 0 :(得分:0)

我建议添加一个名为“construction”

的列

如果需要保存您需要的值,则至少使其成为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子句中使用LIKE:

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

有趣的是,您可以在回溯脚本中计算冒号数量,以确定产品的“深度”。这样可以很容易地格式化输出等。例如,在输出HTML的mod_perl处理程序中,您可能会说:

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>");
}