以下是一个示例查询,说明了我遇到的问题的简化版本:
SELECT max_discount, product_name
FROM products
LEFT JOIN (
SELECT IF(MAX(discount_percentage) IS NOT NULL, MAX(discount_percentage), 5) AS max_discount,
product_id,
order_id
FROM orders
LEFT JOIN discounts ON discounts.id = orders.discount_id
GROUP BY order_id
) AS alias ON alias.product_id = products.product_id
GROUP BY alias.order_id
在这种情况下,我可以有多个"折扣" (代金券)与同一订单有关。但如果有多个与单个订单相关的折扣,我只想实际应用最高价值的折扣。例如,如果您有50%折扣的优惠券和另外8折的优惠券,在这种情况下,他们都将存储在数据库中。但我不想给你70%的折扣,我想给你50%的折扣(两者中较高者)。因此,选择MAX()
值的子查询。
如果您没有任何折扣券,我仍然希望给您5%的折扣,因为那是我们现在的促销活动。因此IF
的其他部分会尝试将其设置为5.
这里的问题是,即使我的条件是MAX() IS NOT NULL
,并且我试图在NULL
时将其设置为5,但它仍然会显示为NULL
结果。
如果我使用包含IF
值的简单字段执行NULL
条件,例如SELECT name, IF(age IS NULL, 'Unknown', age) AS age FROM people
,那么它会按预期工作。那么为什么它不适用于MAX()
子查询?
答案 0 :(得分:0)
您是否尝试过COALESCE函数 - 返回第一个非空值:
SELECT COALESCE(MAX(discount_percentage), 5) ......
答案 1 :(得分:0)
你想要外层的COALESCE()
。但是在查询中存在更大的问题,因为product_id
不在子查询中。
SELECT COALESCE(max_discount, 5), product_name
FROM products p LEFT JOIN
(SELECT MAX(discount_percentage) AS max_discount,
product_id, order_id
FROM orders o LEFT JOIN
discounts d
ON d.id = o.discount_id
GROUP BY o.order_id, o.product_id
) od
ON od.product_id = p.product_id
GROUP BY od.order_id
我仍然不确定这是否正确,因为结构看似奇怪 - 订单折扣而非产品折扣。在外部查询中按order_id
进行汇总,但不包括SELECT
中的@Html.ActionLink("Morn Info", "Solutions", "Home", null, null, "EOB",null, null)
。没有样本数据和期望的结果,很难说出你真正需要的是什么。