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