我有“产品”表,它包含所有产品详细信息。
product_id product_type_id internal_name
1001 finishedgood nokia
1002 rawmaterial chip
1003 subassembly diaplay
1004 rawmaterial 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
- - - -
我想显示子组件所需的原材料。
意味着,我的查询应该返回完成所需的所有原材料和子组件。以及子组件所需的原材料。
这只是一个样本。我有一个产品的大约100个组件。
答案 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>");
}