mysql - Joing multiple with one master table -
i have 6 tables- project,equipment,fish,staff , junction tables - project_equipment,project_fish , project_staff.i want retrieve project total cost.
so, wrote statement follows,
select p.projectid, (sum(e.equipprice*pe.equantity)+sum(f.fishprice*pf.fquantity)+sum(ps.salary)) projectcost equipment e inner join project_equipment pe on e.equipid=pe.equipid inner join project p on pe.projectid=p.projectid inner join project_fish pf on p.projectid=pf.projectid inner join fish f on pf.fishid=f.fishid inner join project_staff ps on p.projectid=ps.projectid inner join staff s ps.staffid=s.staffid group projectid but, got price twice of correct amount.
your query end lot of duplicate results. consider following simpler case:
table: project projectid equantity 1 1 2 1 table: equipment equipid eprice 1 1 2 1 table: fish fishid 1 2 table: project_equipment projectid equipid 1 1 1 2 2 1 2 2 table: project_fish projectid fishid 1 1 1 2 2 1 2 2 now, let's @ results of project_equipment query only:
select p.projectid, e.eprice, pe.equantity project p inner join project_equipment pe on pe.projectid=p.projectid inner join equipment e on e.equipid=pe.equipid projectid eprice equantity 1 1 1 // 1 1 1 // b 2 1 1 // c 2 1 1 // d that's expected; list of price , quantity of each piece of equipment used each project. think happen when inner join that project_fish? first result has project 1 in twice, , project 2 in twice, end every combination of result , project_fish!
select p.projectid, e.eprice, pe.equantity, f.fishid project p inner join project_equipment pe on pe.projectid=p.projectid inner join equipment e on e.equipid=pe.equipid inner join project_fish pf on pf.projectid=p.projectid projectid eprice equantity fishid 1 1 1 1 // above 1 1 1 2 // above 1 1 1 1 // b above 1 1 1 2 // b above 2 1 1 1 // c above 2 1 1 2 // c above 2 1 1 1 // d above 2 1 1 2 // d above this duplication continue every inner join. amount price off won't 2x, depend on number of combinations of joins.
so, can't trying particular query. instead you'll have calculate cost of each relationship separately. sum together. can selecting each 1 separately , calculating cost projectid , projectcost column, using union concatenate altogether, once again grouping results projectid , summing individual projectcost subtotals.
i explained poorly, think of subtotaling equipment, fish, , salary costs, sticking subtotals 1 table , summing that. e.g.:
select x.projectid, sum(x.projectcost) ( select p.projectid, sum(e.eprice * pe.equantity) projectcost project p inner join project_equipment pe on pe.projectid=p.projectid inner join equipment e on e.equipid=pe.equipid group p.projectid union select p.projectid, sum(f.fprice * pf.fquantity) projectcost project p inner join project_fish pf on pf.projectid=p.projectid inner join fish f on f.fishid=pf.fishid group p.projectid union select p.projectid, sum(s.salary) projectcost project p inner join project_staff ps on ps.staffid=p.projectid inner join staff s on s.staffid=ps.staffid group p.projectid ) x group x.projectid each of subqueries produces projectid column , projectcost column. run subquery (between parens) see results. outer query adds subtotals projects.
sorry, btw, renamed equipprice , fishprice columns eprice , fprice when testing.
Comments
Post a Comment