Mysql 用一个主表联接多个

Mysql 用一个主表联接多个,mysql,Mysql,我有六个表-项目、设备、鱼、人员和连接表-项目设备、项目鱼和项目人员。我想检索项目总成本。 因此,我写了如下声明: 选择P.ProjectID、SUME.EquipPrice*PE.Equity+SUMF.FishPrice*PF.FQuantity+SUMPS.Salary作为项目成本 从设备为E内部连接项目\u设备为PE 在E.EquipID=PE.EquipID上 作为P的内部联接项目 关于PE.projectd=P.projectd 内部连接项目作为PF 关于P.projectd=PF.

我有六个表-项目、设备、鱼、人员和连接表-项目设备、项目鱼和项目人员。我想检索项目总成本。 因此,我写了如下声明:

选择P.ProjectID、SUME.EquipPrice*PE.Equity+SUMF.FishPrice*PF.FQuantity+SUMPS.Salary作为项目成本 从设备为E内部连接项目\u设备为PE 在E.EquipID=PE.EquipID上 作为P的内部联接项目 关于PE.projectd=P.projectd 内部连接项目作为PF 关于P.projectd=PF.projectd 内部连接鱼作为F 关于PF.FishID=F.FishID 内部加入项目组工作人员作为PS 关于P.projectd=PS.projectd 内部员工以S的身份加入 PS.StaffID=S.StaffID 按投影分组
但是,我得到的价格是正确金额的两倍。

您的查询将得到大量重复结果。考虑以下更简单的情况:

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
现在,让我们只看一个项目设备查询的结果:

SELECT p.projectid, e.eprice, pe.equantity FROM 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   // a
1    1    1   // b
2    1    1   // c
2    1    1   // d
这是意料之中的事;每个项目使用的每件设备的价格和数量清单。但是你认为当我们加入到鱼的计划中时会发生什么呢?第一个结果中有项目1两次,项目2两次,所以我们最终得到了该结果和项目的每一个组合

这种重复将在每个内部联接中继续进行。您的价格折扣金额并不总是2倍,它实际上取决于您所有连接的组合数量

因此,您无法真正使用这个特定的查询执行您正在尝试执行的操作。相反,您必须分别计算每种关系的成本。然后把这些加起来。您可以通过分别选择每个项目并将成本计算到ProjectID和ProjectCost列中,使用UNION将它们连接在一起,然后再次按ProjectID对结果进行分组并对各个ProjectCost小计求和来实现这一点

我解释得很糟糕,但可以把它看作是对设备、鱼和工资成本的小计,然后将所有这些小计放在一个表中并进行汇总。例如:

每个子查询生成一个projectid列和一个ProjectCost列。在参数之间单独运行子查询以查看结果。外部查询然后添加项目的小计


抱歉,顺便说一句,我在测试时将EquipPrice和FishPrice列重命名为EPrice和FPrice。

最近通货膨胀确实失控了。更严重的是;不确定这是否与你的问题有关,但你写了PF.Salary。我的直觉告诉我,鱼计划中没有工资栏。这就是您正在使用的实际查询吗?我也看不到“从员工中选择”。很抱歉,我的键入错误。我将工资存储在Project_Staff表中。但结果仍然是两次。能否向我们显示表的架构?然后用你想要的输出发布一些样本数据?我尝试了你建议的语句!兄弟@JasonC。但我得到了这个错误1248-每个派生表都必须有自己的别名对象;我在SQLite上进行了测试,其中子查询不需要别名。已编辑,应立即修复。我将子查询化名为x,并将表限定符添加到外部projectid和projectcost中。
SELECT p.projectid, e.eprice, pe.equantity, f.fishid FROM 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   // from a above
1    1    1    2   // from a above
1    1    1    1   // from b above 
1    1    1    2   // from b above
2    1    1    1   // from c above
2    1    1    2   // from c above
2    1    1    1   // from d above
2    1    1    2   // from d above
SELECT x.projectid, SUM(x.ProjectCost) FROM 
(
    SELECT p.projectid, SUM(e.eprice * pe.equantity) ProjectCost FROM project p
    INNER JOIN project_equipment pe ON pe.projectid=p.projectid
    INNER JOIN equipment e ON e.equipid=pe.equipid
    GROUP BY p.projectid
  UNION
    SELECT p.projectid, SUM(f.fprice * pf.fquantity) ProjectCost FROM project p
    INNER JOIN project_fish pf ON pf.projectid=p.projectid
    INNER JOIN fish f ON f.fishid=pf.fishid
    GROUP BY p.projectid
  UNION
    SELECT p.projectid, SUM(s.salary) ProjectCost FROM project p
    INNER JOIN project_staff ps ON ps.staffid=p.projectid
    INNER JOIN staff s ON s.staffid=ps.staffid
    GROUP BY p.projectid
) x
GROUP BY x.projectid