如何从相关表求和

ef1yzkbh  于 2021-06-15  发布在  Mysql
关注(0)|答案(3)|浏览(425)

我有一个主表和一个子表。主表是部件的主列表,子表是构建它所需的集合部件。每个子零件都通过parentid链接到其父零件。
零件或“child”有一个childid,它指向主零件列表中自己的条目。我们使用这个链接来获取它的价格,因为在子表中,只存储id。
如果我想把构成每个父部分的所有子部分的总成本加起来。我将如何构造该查询?
total cost应该是一个计算字段,它选择子表中parentid==到其id的所有部分,并将它们的价格*数量相加。
以下是我目前掌握的情况:

  1. //This Query Doesnt work. Just returns 0.
  2. SELECT SUM(PricePer * Qty)
  3. FROM sub inner join main on sub.ChildPID = main.ID where sub.ParentPID = main.ID
  4. //This query will work, where the main.ID is entered manually. but I cant do this
  5. SELECT SUM(PricePer * Qty)
  6. FROM sub inner join main on sub.ChildPID = main.ID where sub.ParentPID = 1

例子:
主表

  1. ID | Name | TotalCost | PricePer
  2. 1 Part1 10.00 14.00** SELECTED
  3. 2 Part2 0.00 6.00
  4. 3 Part3 0.00 2.00

子表

  1. ParentID | ChildID | Name | Qty
  2. 1 2 Part2 1
  3. 1 3 Part3 2
svmlkihl

svmlkihl1#

下面是一个级别的选择:

  1. SELECT m.priceper + SUM(s1.qty * m2.priceper) AS priceper
  2. FROM main m
  3. LEFT JOIN sub s1 ON (m.id = s1.parentid)
  4. LEFT JOIN main m2 ON (m2.id = s1.childid)
  5. -- WHERE m.id = 1
  6. GROUP BY m.id;

对于2个级别,它将是这样的(我无法尝试,可能需要一些修复):

  1. SELECT m1.id, m1.priceper + IFNULL(SUM(s1.qty * g2.priceper),0) AS priceper
  2. FROM main m1
  3. LEFT JOIN sub s1 ON (m1.id = s1.parentid)
  4. LEFT JOIN (
  5. SELECT m2.id, m2.priceper + IFNULL(SUM(s2.qty * g2.priceper),0) AS priceper
  6. FROM main m2
  7. LEFT JOIN sub s2 ON (m2.id = s2.parentid)
  8. LEFT JOIN main g2 ON (g2.id = s2.childid)
  9. GROUP BY m2.id)
  10. g2 ON (g2.id = s1.childid)
  11. -- WHERE m1.id = 1
  12. GROUP BY m1.id;

要深入研究,您需要用g3的子查询替换主表,等等。。。

  1. SELECT m1.id, m1.priceper + IFNULL(SUM(s1.qty * g2.priceper),0) AS priceper
  2. FROM main m1
  3. LEFT JOIN sub s1 ON (m1.id = s1.parentid)
  4. LEFT JOIN (
  5. SELECT m2.id, m2.priceper + IFNULL(SUM(s2.qty * g2.priceper),0) AS priceper
  6. FROM main m2
  7. LEFT JOIN sub s2 ON (m2.id = s2.parentid)
  8. LEFT JOIN (
  9. SELECT m3.id, m3.priceper + IFNULL(SUM(s3.qty * g3.priceper),0) AS priceper
  10. FROM main m3
  11. LEFT JOIN sub s3 ON (m3.id = s3.parentid)
  12. LEFT JOIN main g3 ON (g3.id = s3.childid)
  13. GROUP BY m3.id) g2
  14. ON (g2.id = s2.childid)
  15. GROUP BY m2.id) g2
  16. ON (g2.id = s1.childid)
  17. -- WHERE m1.id = 1
  18. GROUP BY m1.id;

对于4个级别,如下所示:

  1. SELECT m1.id, m1.priceper + IFNULL(SUM(s1.qty * g2.priceper),0) AS priceper
  2. FROM main m1
  3. LEFT JOIN sub s1 ON (m1.id = s1.parentid)
  4. LEFT JOIN (
  5. SELECT m2.id, m2.priceper + IFNULL(SUM(s2.qty * g2.priceper),0) AS priceper
  6. FROM main m2
  7. LEFT JOIN sub s2 ON (m2.id = s2.parentid)
  8. LEFT JOIN (
  9. SELECT m3.id, m3.priceper + IFNULL(SUM(s3.qty * g3.priceper),0) AS priceper
  10. FROM main m3
  11. LEFT JOIN sub s3 ON (m3.id = s3.parentid)
  12. LEFT JOIN (
  13. SELECT m4.id, m4.priceper + IFNULL(SUM(s4.qty * g4.priceper),0) AS priceper
  14. FROM main m4
  15. LEFT JOIN sub s4 ON (m4.id = s4.parentid)
  16. LEFT JOIN main g4 ON (g4.id = s4.childid)
  17. GROUP BY m4.id) g3
  18. ON (g3.id = s3.childid)
  19. GROUP BY m3.id) g2
  20. ON (g2.id = s2.childid)
  21. GROUP BY m2.id) g2
  22. ON (g2.id = s1.childid)
  23. -- WHERE m1.id = 1
  24. GROUP BY m1.id;
展开查看全部
20jt8wwn

20jt8wwn2#

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

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

lxkprmvk3#

不应该在左连接中使用where子句,否则这将用作内部连接
如果你想把结果和上面的查询连接起来。。你应该按照你想要的与上面的查询相关的键来求和和和分组
你可以直接。。根据连接的结果执行更新,例如:

  1. update main
  2. inner join (
  3. SELECT main.ID, SUM(main.PricePer) total_x_id
  4. FROM sub
  5. INNER join main on sub.ChildID = main.ID
  6. group by main.ID
  7. ) t on t.id = main.id
  8. set total = t.total_x_id

如果你只需要选择

  1. SELECT main.ID, SUM(main.PricePer) total_x_id
  2. FROM sub
  3. INNER join main on sub.ChildID = main.ID
  4. group by main.ID

您可以在上面的查询中使用连接作为

  1. select maint.id, ifnull(t.total_x_id ,0)
  2. from main
  3. left join (
  4. SELECT ChildID.ID as ID, SUM(main.PricePer) total_x_id
  5. FROM sub
  6. group by ChildID.ID
  7. ) t on t.ID = main.id
展开查看全部

相关问题