如何在MAX()列不存在时获取默认值

时间:2015-07-02 15:07:15

标签: mysql

以下是一个示例查询,说明了我遇到的问题的简化版本:

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()子查询?

2 个答案:

答案 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) 。没有样本数据和期望的结果,很难说出你真正需要的是什么。