Mysql 如何从相关表求和

Mysql 如何从相关表求和,mysql,sql,mysql-workbench,Mysql,Sql,Mysql Workbench,我有一个主表和一个子表。主表是部件的主列表,子表是构建它所需的集合部件。每个子零件都通过ParentID链接到其父零件 零件或“子零件”有一个ChildID,它指向主零件列表中自己的条目。我们使用这个链接来获取它的价格,因为在子表中,只存储ID 如果我想把构成每个父部件的所有子部件的总成本加起来。我将如何构造该查询 Total cost应该是一个计算字段,它选择子表中ParentID==的所有零件,并将其价格*数量相加 以下是我目前掌握的情况: //This Query Doesnt work.

我有一个主表和一个子表。主表是部件的主列表,子表是构建它所需的集合部件。每个子零件都通过ParentID链接到其父零件

零件或“子零件”有一个ChildID,它指向主零件列表中自己的条目。我们使用这个链接来获取它的价格,因为在子表中,只存储ID

如果我想把构成每个父部件的所有子部件的总成本加起来。我将如何构造该查询

Total cost应该是一个计算字段,它选择子表中ParentID==的所有零件,并将其价格*数量相加

以下是我目前掌握的情况:

//This Query Doesnt work. Just returns 0.
SELECT SUM(PricePer * Qty)
    FROM sub inner join main on sub.ChildPID = main.ID where sub.ParentPID = main.ID

//This query will work, where the main.ID is entered manually. but I cant do this
SELECT SUM(PricePer * Qty)
    FROM sub inner join main on sub.ChildPID = main.ID where sub.ParentPID = 1

例如:

主表

ID | Name | TotalCost | PricePer 

1    Part1  10.00       14.00**   SELECTED

2    Part2  0.00        6.00

3    Part3  0.00        2.00
子表

ParentID | ChildID | Name | Qty

1          2         Part2  1

1          3         Part3  2

您不应该在左连接中使用where子句,否则将作为内部连接使用
如果要将结果与上级查询联接。。您应该按照要与上一个查询相关的键进行求和和和分组

你可以直接。。根据连接的结果执行更新,例如:

update main  
inner join  (
  SELECT  main.ID, SUM(main.PricePer) total_x_id
  FROM sub 
  INNER  join main on sub.ChildID = main.ID
  group by main.ID 
) t on t.id = main.id 
set total = t.total_x_id 
如果您只需要选择

 SELECT  main.ID, SUM(main.PricePer) total_x_id
 FROM sub 
 INNER  join main on sub.ChildID = main.ID
 group by main.ID 
您可以在上面的查询中使用连接作为

select  maint.id, ifnull(t.total_x_id ,0)
from main 
left  join (
  SELECT  ChildID.ID as ID, SUM(main.PricePer) total_x_id
  FROM sub 
  group by ChildID.ID 
) t  on t.ID = main.id 

以下是一个级别的选择:

SELECT m.priceper + SUM(s1.qty * m2.priceper) AS priceper
FROM main m
LEFT JOIN sub s1 ON (m.id = s1.parentid)
LEFT JOIN main m2 ON (m2.id = s1.childid)
-- WHERE m.id = 1
GROUP BY m.id;
对于2个级别,它将是这样的(我无法尝试,可能需要一些修复):

要向下搜索,您需要将主表替换为g3的子查询,等等

SELECT m1.id, m1.priceper + IFNULL(SUM(s1.qty * g2.priceper),0) AS priceper
FROM main m1
LEFT JOIN sub s1 ON (m1.id = s1.parentid)
LEFT JOIN (
    SELECT m2.id, m2.priceper + IFNULL(SUM(s2.qty * g2.priceper),0) AS priceper
    FROM main m2
    LEFT JOIN sub s2 ON (m2.id = s2.parentid)
    LEFT JOIN (
        SELECT m3.id, m3.priceper + IFNULL(SUM(s3.qty * g3.priceper),0) AS priceper
        FROM main m3
        LEFT JOIN sub s3 ON (m3.id = s3.parentid)
        LEFT JOIN main g3 ON (g3.id = s3.childid)
        GROUP BY m3.id) g2 
        ON (g2.id = s2.childid)
    GROUP BY m2.id) g2 
    ON (g2.id = s1.childid)
-- WHERE m1.id = 1
GROUP BY m1.id;
对于4个级别,它如下所示:

SELECT m1.id, m1.priceper + IFNULL(SUM(s1.qty * g2.priceper),0) AS priceper
FROM main m1
LEFT JOIN sub s1 ON (m1.id = s1.parentid)
LEFT JOIN (
    SELECT m2.id, m2.priceper + IFNULL(SUM(s2.qty * g2.priceper),0) AS priceper
    FROM main m2
    LEFT JOIN sub s2 ON (m2.id = s2.parentid)
    LEFT JOIN (
        SELECT m3.id, m3.priceper + IFNULL(SUM(s3.qty * g3.priceper),0) AS priceper
        FROM main m3
        LEFT JOIN sub s3 ON (m3.id = s3.parentid)
        LEFT JOIN (
            SELECT m4.id, m4.priceper + IFNULL(SUM(s4.qty * g4.priceper),0) AS priceper
            FROM main m4
            LEFT JOIN sub s4 ON (m4.id = s4.parentid)
            LEFT JOIN main g4 ON (g4.id = s4.childid)
            GROUP BY m4.id) g3
        ON (g3.id = s3.childid)
        GROUP BY m3.id) g2 
        ON (g2.id = s2.childid)
    GROUP BY m2.id) g2 
    ON (g2.id = s1.childid)
-- WHERE m1.id = 1
GROUP BY m1.id;

这变得比我想象的要复杂得多。也许这是我没有说得更清楚的错。这是我发现有效的解决方案

Select *, ifnull((SELECT SUM(main.PricePer * Qty)
    FROM sub inner join main on sub.ChildID = main.ID where sub.ParentID = main1.PID), 0) from main as main1

您好,这里有一些链接可以帮助您组织问题:更新您的问题添加适当的数据样本和预期的C结果。。并添加查询的其余部分。。(似乎您使用的是与查询外部部分相关的列…ParentID)次左连接main似乎有点落后。使用示例更新。不知道什么东西倒过来了。但我知道这里有些东西和我写的不一样,没有限制。一个部件可以有一个子部件,子部件本身也有子部件,依此类推。这几乎可以工作,但不太起作用。查询需要是选择,而不是更新。表中表示的值未存储。这是经过计算的,非常有用!在本文的最后一部分,我将如何构造它,使其作为列与主表一起返回?这将返回该列。但是我该如何构造它,使其与Main上的SELECT*对齐OK但是您希望如何将此Result连接到外部/上部查询。。在我的回答中提出的结果给出了使用id将结果与其他查询联接的可能性。。如果你只想得到总数,你应该根据id来过滤结果。使用基于上限查询的where子句。我想将结果与基于where main.id=sub.ParentId的上限查询连接起来。这非常接近于工作。但这是主要部分的总价格,而不是所有的子部分。例如,在我上面的例子中,第3部分的总成本为4,而第1部分的总成本为0。换句话说。它选择每一个子行中的ChildId==main.Id,并合计该选择m1来自何处?更新,现在检查好了该查询卡在“Left join sub s2 on(m.Id=s2.parentid)”-它不识别m.Id,我不确定为什么返回null:(也就是说,M.ID=1必须变成M.ID= S1.PARTEND之类的东西,所以我们得到了整个表,而不仅仅是1的结果。这比我原先认为它会在明天检查它要复杂得多。嗨!在这个解决方案中,你不考虑子部分(2级,3级等),
Select *, ifnull((SELECT SUM(main.PricePer * Qty)
    FROM sub inner join main on sub.ChildID = main.ID where sub.ParentID = main1.PID), 0) from main as main1