MySQL的最大值来自子查询和按问题分组

时间:2011-01-10 19:52:03

标签: mysql group-by subquery

我有三张桌子,我们假装称为产品,优惠券和折扣。我有一个查询尝试提取产品列表,并运行子查询以查找具有有效折扣的任何优惠券。

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

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条件下的计算中使用该值。

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

您只按productid分组,而子选择实际上返回三个值(产品的每个优惠券各一个)。我实际上希望此查询返回错误。您应该将折扣向上移动一级,或将优惠券移至子选择。第一个例子(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