我想存档的内容:

获取用户ID 2002已取消的订单总金额的正确总和。

一些前置信息:

我有deals,其价格在deals.price中,id在deals.ID

然后,我有了orders,并带有deals.ID的外键

运行此SQL:

select SUM(deals.price), orders.* from orders
JOIN deals ON deals.ID = orders.deal_id
where orders.user_id = 2002
and orders.cancelled = 1


效果很好。

这是我卡住的地方:

作为交易的补充,每笔交易都具有各自价格的产品。

该表称为Deal_products,deal_products.price持有价格,deal_products.product_id具有其ID。

将订单附加到另一个称为order_products的表中的交易产品上,其中order_products.product_id = deal_products.product_id

总结:我想做的是在上述SQL中包含if。

如果订单的order_products中有一行,请获取order_products.product_id并在deal_products(价格)中找到价格,并在SUM()处理时使用它而不是deal.price。

如果没有行,则应使用deals.price。

如何归档?首先查看另一个表中是否有条目,然后进一步查看第三个表并获取要使用的值?

最佳答案

您可以使用COALESCE + LEFT JOIN:

select SUM(coalesce(dp.price, d.price)), o.*
from orders o JOIN deals d ON d.ID = o.deal_id
              LEFT JOIN order_products op on op.order_id = o.id
              LEFT JOIN deal_products dp on op.product_id = dp.product_id
where o.user_id = 2002 and o.cancelled = 1
group by ...;


COALESCE函数返回第一个非空操作数

LEFT [OUTER] JOIN = [INNER] JOIN + LEFT JOIN关键字左侧结构的所有行,与右侧结构中的ON子句不匹配。

10-07 15:59