【问题标题】:MySQL max value from subquery and group by problemMySQL 子查询的最大值和按问题分组
【发布时间】:2011-01-10 19:52:03
【问题描述】:

我有三张表,我们假设它们分别称为产品、优惠券和折扣。我有一个查询试图提取产品列表,并运行一个子查询来查找任何具有有效折扣的优惠券。

例如,这显示了我正在尝试的内容:

SELECT products.id, products.name, 
 (
 SELECT MAX(discounts.amount) FROM discounts
 WHERE discounts.coupon_id = coupons.id
 LIMIT 1
 ) as discount
FROM products
LEFT JOIN coupons ON products.id = coupons.product_id
GROUP BY products.id

我的问题是我的 GROUP BY 出于许多其他原因是必要的。但是,如果每个产品有多个优惠券,那么当分组发生时,“折扣”就会以奇怪的方式组合在一起。

假设一个产品有三张优惠券 - 两张没有任何折扣,一张有 33% 的折扣。当 group by 发生时,我想选择最大值,但默认情况下,MySQL 返回值为 0。

使用 MAX 是子查询显然只返回每个优惠券的最大折扣值。我只需要告诉 GROUP BY 使用最大值。

我可以轻松地使用 GROUP_CONCAT 来返回所有这些字符串,但我还需要在某些 HAVING 条件下的计算中使用该值。

有什么建议吗?

【问题讨论】:

    标签: mysql group-by subquery


    【解决方案1】:

    我认为您不需要或不需要子查询。这会给你带来什么回报?

    SELECT products.id, products.name, MAX(discounts.amount) AS discount
    FROM products
    LEFT JOIN coupons ON products.id = coupons.product_id
    LEFT JOIN discounts ON coupons.id = discounts.coupon_id
    GROUP BY products.id
    

    【讨论】:

    • 不幸的是,这并不容易。我会使用连接,但实际上有四个子查询 - 每个子查询都检查不同类型的可能折扣。我似乎不可能以一种不需要每个产品都具有所有四个连接的方式来构建连接。子查询使这种情况更容易/可能。我想我会玩更多的。
    【解决方案2】:

    您仅按 productid 分组,而 subselect 实际上返回三个值(每个产品优惠券一个)。我实际上希望这个查询返回一个错误。您应该将折扣上移一级,或将优惠券移至子选择。第一个示例(子查询在 MySQL 中通常较慢):

    select
      p.productid,
      max(d.discount) as discount
    from
      product p
      left join coupon c on c.productid = p.productid
      left join discount d on d.couponid = c.couponid
    group by
      p.productid
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-27
      • 1970-01-01
      • 2019-05-21
      • 2018-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多