我在使用数据库方面经验很少(我只知道绝对的基础知识)。有了这个说明,我想我的问题很容易解决更有经验的头脑。
我的问题是:
我需要一种能够搜索“所有类型的铝及其所有子材料”的方法吗?
我可以做简单的查询,比如
SELECT *
FROM sub_materials
WHERE category_id = 2;
所以我要求的基本上是能够看到铝的整个分支。我已经看过ltree
和Closure Tables
了但是我很想要一个Noob来解决这个问题。
我相信我必须以某种方式将表格连接为“祖父母,父母,孩子”或类似的东西,但我不知道是否还有其他方式或者?
我甚至不确定我是否以正确的方式这样做。 有人可以就此提出建议吗?
我在数据库中有三个表。(下面是表格中的样本)
materials_category
保留数据库中每种资料的所有类别。
materials
包含类别名称和ID,material_names和ID以及每种材料的值。
有些材料有sub_categories。不仅仅是一些。
3. sub_materials
保存类别信息,材料名称和ID,子材料名称和ID以及sub_material值。
1. `materials_category`
|category_id| category_name|
------------------------------
| 1 | Aggregate |
| 2 | Aluminium |
| 3 | Asphalt |
2. `materials`
|category_id |category_name |material_id |material_name|EE_1|EE_2|EC_1|EC_2
---------------------------------------------------------------------------
| 1 |Aggregate | 1 | General |3 |0 | 52 | 8
| 2 |Aluminium | 2 | General |55 |7 | 9 | 24
| 2 |Aluminium | 3 | Cast Pr |34 |30 | 22 | 28
| 2 |Aluminium | 4 | Extrud. |65 |16 | 8 | 74
| 2 |Aluminium | 5 | Rolled |15 | 0 | 9 | 61
| 3 |Asphalt | 6 |Asphalt, 4% |2 |22 | 6 | 54
| 3 |Asphalt | 7 |Asphalt, 5% |3 |91 | 1 | 4
3. `sub_materials`
|category_id|category_name|material_id|material_name|sub_mar_id|sub_mar_name|EE_1|EE_2|EC_1|EC_2|
|2 |Aluminium |2 |General |1 |Virgin |21 |5 |9 |60 |
|2 |Aluminium |2 |General |2 |Recycled |29 |3 |8 |9 |
答案 0 :(得分:0)
你的表是非规范化的。这通常不是一件好事,除非这是一个仅报告数据库。
无论如何,这是你追求的目标的开始。为什么不运行它并给出一些关于它是否是你想要的反馈。
select *
from materials_category c
left outer join materials m
on c.category_id = m.category_id
left outer join sub_materials s
on s.material_id = m.material_id
where c.category_name = 'Aluminium'
查看您的数据,我猜测它已经回收了#39;可以适用于任何数量的材料类别,而不仅仅是铝?你会收到一大堆“回收利用”吗?您的sub_materials中的记录是否允许每个material_category?