我想要做的是写一个选择,它会显示汽车维修的详细信息。正如您在表Repairs
中看到的,只有2个属性,但我不确定是否需要添加更多属性,特别是employees_list
和parts_list
中的属性,因为我想要显示每辆车的维修数据plate_number
。通过维修数据,我的意思是修理id
,车辆plate_number
,所有从事维修工作的员工以及维修时使用的所有部件。如果我的图表错了,请帮我修复它,我不知道如何编写select for this,因为有多对多的关系和绑定表的使用。
答案 0 :(得分:0)
这并不像看起来那么难。
首先,显然,我们必须选择汽车:
select vehicles.* from vehicles
然后,让我们加入修理:
select
vehicles.*
from vehicles
inner join repairs on vehicles.id = repairs.vehicle.id
我们不需要修改套装中的维修数据,所以我们只是加入,但没有提及“选择”。部分。
然后我们必须加入维修所需的零件,以及零件本身的信息:
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
顺便说一句,我建议你把你的桌子重命名为小写和单面。 喜欢:'维修','员工'和' vehicle&#39 ;;
另外,将绑定表命名为:' 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
注意优雅' on'条件现在看起来:parts_repair.part_id = part.id,parts_repair.part_id = part.id
抱歉英语不好