最近我在学习MySQL,需要创建一个包含层次结构数据的数据库。
我有多种不同类型的数据需要以树形格式呈现,但不知道如何操作。
例如,假设我有一个人,可以雇用其他人,也可以被其他人雇用。每个人可能会借出设备,并且每个设备必须有名称、描述和替换部件清单,每个替换部件都必须有成本等信息。
我看到的大多数闭包表示例都集中在处理论坛或线程式评论方面。如何创建一个具有多种数据类型的闭包表?
最近我在学习MySQL,需要创建一个包含层次结构数据的数据库。
我有多种不同类型的数据需要以树形格式呈现,但不知道如何操作。
例如,假设我有一个人,可以雇用其他人,也可以被其他人雇用。每个人可能会借出设备,并且每个设备必须有名称、描述和替换部件清单,每个替换部件都必须有成本等信息。
我看到的大多数闭包表示例都集中在处理论坛或线程式评论方面。如何创建一个具有多种数据类型的闭包表?
select * from person
| pID | name | employedBy |
+-----+-----------+------------+
| 1 | John Doe | 2 |
| 2 | Joe Smith | NULL |
| 3 | Meg Ryan | 3 |
select * from equipment
| eqID | eqName | eqDescription | eqOwner | eqCheckedOutTo |
+------+----------+-------------------+---------+----------------+
| 1 | stuff | just some stuff | 3 | NULL |
| 2 | table | a table | 1 | NULL |
| 3 | computer | PC computer | 3 | 2 |
| 4 | 3table | table with 3 legs | 2 | NULL |
select * from parts;
| partID | partName | partCost |
+--------+--------------+----------+
| 1 | desktop1 | 499.99 |
| 2 | monitor13x13 | 109.95 |
| 3 | windows95 | 10.00 |
| 4 | speakers | 30.00 |
| 5 | tabletop | 189.99 |
| 6 | table leg | 59.99 |
select * from equipmentParts
| epID | eqID | partID | quantity |
+------+------+--------+----------+
| 1 | 3 | 1 | 1 |
| 2 | 3 | 2 | 2 |
| 3 | 3 | 3 | 1 |
| 4 | 2 | 5 | 1 |
| 5 | 2 | 6 | 4 |
| 6 | 4 | 5 | 1 |
| 7 | 4 | 6 | 3 |
然后你可以这样查询:
select name,eqName,e.eqID,partName,partCost,quantity,(quantity*partCost) AS totCost
from person p
inner join equipment e ON e.eqOwner=p.pID
inner join equipmentParts ep ON ep.eqID=e.eqID
inner join parts pa ON ep.partID=pa.partID
| name | eqName | eqID | partName | partCost | quantity | totCost |
+-----------+----------+------+--------------+----------+----------+---------+
| John Doe | table | 2 | tabletop | 189.99 | 1 | 189.99 |
| John Doe | table | 2 | table leg | 59.99 | 4 | 239.96 |
| Meg Ryan | computer | 3 | desktop1 | 499.99 | 1 | 499.99 |
| Meg Ryan | computer | 3 | monitor13x13 | 109.95 | 2 | 219.90 |
| Meg Ryan | computer | 3 | windows95 | 10.00 | 1 | 10.00 |
| Joe Smith | 3table | 4 | tabletop | 189.99 | 1 | 189.99 |
| Joe Smith | 3table | 4 | table leg | 59.99 | 3 | 179.97 |
select name,eqName,sum(quantity*partCost) AS totCost
from person p
inner join equipment e ON e.eqOwner=p.pID
inner join equipmentParts ep ON ep.eqID=e.eqID
inner join parts pa ON ep.partID=pa.partID
group by e.eqID
| name | eqName | totCost |
+-----------+----------+---------+
| John Doe | table | 429.95 |
| Meg Ryan | computer | 729.89 |
| Joe Smith | 3table | 369.96 |