Mysql 联接表,并在每个表上预执行聚合

Mysql 联接表,并在每个表上预执行聚合,mysql,sql,Mysql,Sql,我有以下表格: 表零件清单: part_number | description | type 100 blablabla blabla 表零件清单供应商: part_id | artikel 100 100100 100 200100 我有一个疑问: select part_list.part_number, part_list.description, part_list.type, group_concat(coalesce(part

我有以下表格:

表零件清单:

part_number | description | type
100           blablabla     blabla
表零件清单供应商:

part_id | artikel
100       100100
100       200100
我有一个疑问:

select part_list.part_number, part_list.description, part_list.type, group_concat(coalesce(part_list_supplier.artikel, "nothing")) as "artikel"
from part_list 
left join part_list_supplier on (part_list.part_number = part_list_supplier.part_id)
group by part_list.part_number;
结果是:

part_number | description | type   | artikel
100           blablablabla  blabla   100100,200100
但我想显示它背后每个零件的总库存量。表格收据:

Number |  import 
100     5   
100     10
表销售:

Number | sold 
100     5
这是我对一个表的查询:

SELECT SUM(sold) AS sold
 FROM sales WHERE number = '".$partnumber.”'
但我想计算每个数字的库存,这必须显示在其他结果后面。 全部结果如下:

part_number | description | type   | artikel            | stock
100           blablablabla  blabla   100100,200100        10

库存应该是10,因为进口的总数是15(5+10),销售的总数是5。

我可能没有正确理解你的问题,但是你不能将
sum(sales.seld)
添加到select语句中并加入销售表吗?例如:

select part_list.part_number, part_list.description, part_list.type, group_concat(coalesce(part_list_supplier.artikel, "nothing")) as "artikel", sum(sales.sold)
from part_list 
left join part_list_supplier on (part_list.part_number = part_list_supplier.part_id)
left join sales on (part_list.part_number = sales.number
group by part_list.part_number;

我把它分成几部分来解决它。我首先写了两个查询,一个计算总收入,另一个计算总销售额:

SELECT r.number, SUM(r.import) AS totalIn
FROM receipt r
GROUP BY r.number;

SELECT s.number, SUM(s.sold) AS totalOut
FROM sales s
GROUP BY s.number;
然后,我将其作为联接的两个子查询来获取股票:

SELECT r.number, totalIn - totalOut AS stock
FROM(
  SELECT r.number, SUM(r.import) AS totalIn
  FROM receipt r
  GROUP BY r.number) r
JOIN(
  SELECT s.number, SUM(s.sold) AS totalOut
  FROM sales s
  GROUP BY s.number) s ON s.number = r.number;
一旦我验证了这一点并给出了适当的库存,我就能够将这些子查询包含到您的原始查询中,以构建以下内容:

SELECT pl.part_number, pl.description, pl.type, 
    GROUP_CONCAT(COALESCE(pls.artikel, "Nothing.")) AS artikel,
    r.totalIn - s.totalOut AS stock
FROM part_list pl
LEFT JOIN part_list_supplier pls ON pls.part_id = pl.part_number
JOIN(
  SELECT number, SUM(import) AS totalIn
  FROM receipt
  GROUP BY number) r ON r.number = pl.part_number
JOIN(
  SELECT number, SUM(sold) AS totalOut
  FROM sales
  GROUP BY number) s ON s.number = r.number
GROUP BY pl.part_number;
这里有一个例子