繁体   English   中英

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

[英]MySQL max value from subquery and group by problem

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

例如,这显示了我的尝试:

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%的折扣。 发生分组依据时,我想选择最大值,但默认情况下,MySQL返回的值为0。

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

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

有什么建议么?

我认为您不需要或不需要子查询。 这对您有什么回报?

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

您仅按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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM