我有“产品”表,它包含所有产品的详细信息。
product_id product_type_id internal_name
1001 finishedgood nokia
1002 rawmaterial chip
1003 subassembly diaplay
1004 rawmaterial displaybase
意思是做诺基亚手机(finishedgood)公司需要的
芯片(原 Material ),显示器(组件)。制作显示器(子组件)它再次需要
displaybase ( rawmaterial)
现在“productassoc”表详细信息
product_id product_id_to
1001 1002
1001 1003
1003 1004
我的问题:我想检索诺基亚制造所需的所有对象
此查询返回需要的 1 级商品。(我还想显示
子组件所需的原 Material )
查询:
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
-----
我也想展示组装所需的原 Material 。
意味着,我的查询应该返回制作
finishedgood 所需的所有原 Material 和子组件。以及子组件所需的原 Material 。
这只是一个示例。我有大约 100 个产品组件。
最佳答案
我建议添加一个名为“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>");
}
关于mysql - 如何在层次结构中显示,,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5014895/