左加入 MySQL 查看
Left Join in MySQL View
我有两个 table,一个跟踪产品的购买(由其 EAN 表示),另一个跟踪产品的销售。但并非所有出售的产品都在购买 table 中,反之亦然。例如:
购买
PurchaseNo
EAN
1
0001
2
0002
3
0003
4
0004
促销
SaleNo
EAN
1
0002
2
0003
3
0004
4
0005
我还有一个 table,其中包含 EAN 编号的产品规格:
ProductEAN
EAN
Name
0001
Product1
0002
Product2
0003
Product3
0004
Product4
0005
Product5
我现在想创建一个视图来告诉我当前的库存(即使库存为负)。我目前的方法是创建一个购买和销售视图,其中“金额”列告诉我我购买或销售了多少产品。
所以对于我的购买来说:
CREATE VIEW `PurchaseAmount` AS
SELECT
`ProductEAN`.`EAN` AS `EAN`,
COUNT(`Purchase`.`EAN`) AS `Amount`
FROM (`ProductEAN` JOIN `Purchase`)
WHERE `ProductEAN`.`EAN` = `Purchase`.`EAN`
GROUP BY `ProductEAN`.`EAN`
以及我的销售额。
我现在想结合这两个视图来创建我的最终库存视图。问题是,据我所知和测试,我只能在我的视图中进行正常连接,这会导致我的两个“子”视图不包含未购买或出售的 EAN。因此,我的最终库存视图只能显示购买和销售中的 EAN table。
有什么方法可以在 MySQL 视图中进行左连接以仅保留所有 EAN,即使它们未在 table 视图引用中使用也是如此。
您可以先分别计算 COUNT
的购买和销售,然后将 LEFT JOIN
作为最后的操作,以提高查询效率。
SELECT
ProductEAN.EAN AS EAN,
COALESCE(Purchases.num_purchases, 0) AS num_purchases,
COALESCE(Sales.num_sales, 0) AS num_sales
FROM
ProductEAN
LEFT JOIN
(
SELECT
EAN,
COUNT(EAN) AS num_purchases
FROM
Purchase
GROUP BY
EAN
) Purchases
ON
ProductEAN.EAN = Purchases.EAN
LEFT JOIN
(
SELECT
EAN,
COUNT(EAN) AS num_sales
FROM
Sale
GROUP BY
EAN
) Sales
ON
ProductEAN.EAN = Sales.EAN
因此您可以获取此代码并将其存储在视图中。
参考这个fiddle进行测试:https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=b2d777f367960cf90d6539980c2ad935。
我有两个 table,一个跟踪产品的购买(由其 EAN 表示),另一个跟踪产品的销售。但并非所有出售的产品都在购买 table 中,反之亦然。例如:
购买
PurchaseNo | EAN |
---|---|
1 | 0001 |
2 | 0002 |
3 | 0003 |
4 | 0004 |
促销
SaleNo | EAN |
---|---|
1 | 0002 |
2 | 0003 |
3 | 0004 |
4 | 0005 |
我还有一个 table,其中包含 EAN 编号的产品规格:
ProductEAN
EAN | Name |
---|---|
0001 | Product1 |
0002 | Product2 |
0003 | Product3 |
0004 | Product4 |
0005 | Product5 |
我现在想创建一个视图来告诉我当前的库存(即使库存为负)。我目前的方法是创建一个购买和销售视图,其中“金额”列告诉我我购买或销售了多少产品。
所以对于我的购买来说:
CREATE VIEW `PurchaseAmount` AS
SELECT
`ProductEAN`.`EAN` AS `EAN`,
COUNT(`Purchase`.`EAN`) AS `Amount`
FROM (`ProductEAN` JOIN `Purchase`)
WHERE `ProductEAN`.`EAN` = `Purchase`.`EAN`
GROUP BY `ProductEAN`.`EAN`
以及我的销售额。
我现在想结合这两个视图来创建我的最终库存视图。问题是,据我所知和测试,我只能在我的视图中进行正常连接,这会导致我的两个“子”视图不包含未购买或出售的 EAN。因此,我的最终库存视图只能显示购买和销售中的 EAN table。
有什么方法可以在 MySQL 视图中进行左连接以仅保留所有 EAN,即使它们未在 table 视图引用中使用也是如此。
您可以先分别计算 COUNT
的购买和销售,然后将 LEFT JOIN
作为最后的操作,以提高查询效率。
SELECT
ProductEAN.EAN AS EAN,
COALESCE(Purchases.num_purchases, 0) AS num_purchases,
COALESCE(Sales.num_sales, 0) AS num_sales
FROM
ProductEAN
LEFT JOIN
(
SELECT
EAN,
COUNT(EAN) AS num_purchases
FROM
Purchase
GROUP BY
EAN
) Purchases
ON
ProductEAN.EAN = Purchases.EAN
LEFT JOIN
(
SELECT
EAN,
COUNT(EAN) AS num_sales
FROM
Sale
GROUP BY
EAN
) Sales
ON
ProductEAN.EAN = Sales.EAN
因此您可以获取此代码并将其存储在视图中。
参考这个fiddle进行测试:https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=b2d777f367960cf90d6539980c2ad935。