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

标签 mysql

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

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/

相关文章:

mysql like 包含 % 的字符串

mysql - knex 使用 Promise 同步两个 mysql 查询

mysql - Where 子句未按预期工作 : I get data from 2 different IDs when only one is specified

mysql - 在 Openshift v3 中将 mysql 与 Spring Boot 应用程序连接

python - 创建 SQLAlchemy 对象时的自定义操作

Mysql仅修改注释列

php - SMTP Sendmail With PEAR 不使用数据库格式

php - 处理来自不同用户的同时 MySQL 查询

android - MySQL数据不以表格形式显示

mysql - 聚合查询的 View 或存储过程?