这并不像看起来那么难。
首先,显然,我们必须选择汽车:
select vehicles.* from vehicles
那么,我们一起来维修吧:
select
vehicles.*
from vehicles
inner join repairs on vehicles.id = repairs.vehicle.id
我们不需要resule set中的repairs数据,所以我们只是加入它,但在'select'部分没有提及。
然后我们必须加入维修所需的零件,以及有关零件本身的信息:
select
vehicles.*
from vehicles
inner join repairs on vehicles.id = repairs.vehicle.id
inner join parts_list on parts_list.repair_id = repairs.id
inner join parts on parts_list.part_id = parts.id
对于该查询,我们得到的行数相当于维修所需的零件数量。但是如果我们将它们全部聚合到 json 列中,在代码中处理这些数据会更容易。所以在结果集中我们会看到类似的东西:
vehicle_id, vehicle_part, parts_needed_as_json
让我们汇总一下:
select
vehicles.*, json_agg(parts.*) as parts_needed
from vehicles
inner join repairs on vehicles.id = repairs.vehicle_id
inner join parts_list on parts_list.repair_id = repairs.id
inner join parts on parts_list.part_id = parts.id
group by vehicles.id, repairs.id
现在您可以为员工添加相同的逻辑:
select
vehicles.*,
json_agg(parts.*) as parts_needed,
json_agg(employes.*) as employees_needed
from vehicles
inner join repairs on vehicles.id = repairs.vehicle.id
inner join parts_list on parts_list.repair_id = repairs.id
inner join parts on parts_list.part_id = parts.id
inner join employees_list on employes_list.repair_id = repairs.id
inner join employees on employees_list.employee_id = employees.id
group by vehicles.id, repairs.id
顺便说一句,我建议您将表格重命名为小写和单数。
比如:“维修”、“员工”和“车辆”;
另外,将绑定表命名为:“repair_part”和“repair_employee”。
有些人甚至建议按字母顺序排列该名称中的相关表,例如:'employee_repair' 和'part_repair',但我认为这不是必需的;
也许这是一个品味问题,但在大多数情况下,这会导致更具可读性的查询。
也就是说,上面的查询看起来像:
select
vehicle.*,
json_agg(part.*) as parts_needed,
json_agg(employee.*) as employees_needed
from vehicle
inner join repair on vehicle.id = repair.vehicle_id
inner join parts_repair on parts_repair.repair_id = repair.id
inner join part on parts_repair.part_id = part.id
inner join employees_repair on employees_repair.repair_id = repair.id
inner join employee on employees_repair.employee_id = employee.id
group by vehicle.id, repair.id
注意“开启”条件现在看起来多么优雅:parts_repair.part_id = part.id, parts_repair.part_id = part.id
抱歉英语不好