【问题标题】:Get sum of min values in each group from Mysql从Mysql获取每组中的最小值总和
【发布时间】:2016-11-23 18:22:01
【问题描述】:

我正在尝试检索某些型号的最低价格。 每个模型都属于属于某个产品的某个组。

我有以下表格:

产品

model_id   product_id   price
    1              1         100
    2              1         120
    3              1         100
    4              1         200
    5              1         250
   10              1         20
   11              1         50
   12              1         50

产品概述

model_id   product_id   group_id
    1              1           A
    2              1           A
    3              1           A
    4              1           A
    5              1           A
   10              1           B
   11              1           B
   12              1           B

产品组可选

group_id   product_id
   B            1

有些组可以是可选的,这意味着除非会员想另外选择,否则价格将为零。

所以在上面的例子中,我想得到每个组的最低价格的总和。 我们有两组,A组和B组。 A 组最低价格值为 100(model_id 1 和 3) B 组最低价格值为 20(model_id 10),但由于 B 组是可选的,因此这意味着最低价格值为 0。

最小值的总和:100(A 组)+ 0(B 组)= 100

到目前为止我的代码:

SELECT po.group_id,
CASE WHEN
  ((SELECT COUNT(*) FROM product_group_optional pgo
    WHERE po.group_id = group_id AND po.product_id = 1 AND po.product_id = product_id) >= 1)
  THEN SUM(0)
  ELSE SUM(p.price)
  END AS sum_price   
FROM product_overview po, product p
WHERE po.product_id = 1
AND po.model_id = p.model_id
AND p.price = (
    SELECT MIN(p2.price)
        FROM product p2, product_overview po2
        WHERE po2.product_id = 1 AND po2.group_id = po.group_id
        AND po2.model_id = p2.model_id
    )
GROUP BY po.group_id

输出:

group_id    sum_price
    A         200
    B          0

问题是我得到了 A 组的 200,但应该是 100。 有 2 个模型的最小值为 100,模型 1 和模型 3。我假设它们的总和 = 100 + 100 = 200。

问题 a) 但我只想取最小值,不管这个值存在多少次。

问题 b) 另外,我正在尝试获取 A 组和 B 组的这两个输出总和的总和。

但我不知道该怎么做。 我希望它在这个查询中完成。

期望的输出

Sum of all groups
     100

谁能指引我正确的方向?

【问题讨论】:

  • 我认为你应该限制 1 这样你就只能得到一个值?
  • 您好 Ahmad,我试图在底部的“AND p.price =”内的“选择查询”中限制它,但它不起作用。
  • 在您的查询中,您在联接中使用 attribute_id,但不要在结构中提及该列
  • 对不起 Philipp,它的意思是 model_id。马上修复
  • 好的,你想在这个查询中解决问题 a) AND b) 吗?

标签: php mysql sum min


【解决方案1】:

您可以使用以下查询:

SELECT SUM(min_price)
FROM (
  SELECT po.group_id, 
         MIN(CASE WHEN pgo.group_id IS NULL THEN price ELSE 0 END) AS min_price
  FROM Product AS p
  INNER JOIN Product_overview AS po 
     ON p.product_id = po.product_id AND p.model_id = po.model_id
  LEFT JOIN Product_group_optional AS pgo ON po.group_id = pgo.group_id
  GROUP BY po.group_id) AS t

【讨论】:

  • 您好 Giorgos,非常感谢您的建议。会试一试,让你知道它是否有效
  • 再次感谢 Giorgos 的帮助。它没有按我想要的方式工作,但您的一些查询对我解决问题有很大帮助。
【解决方案2】:

我不确定我是否了解您的表的键以及问题所在。
有几个问题。
a) 答案应该是 120?
b) 如果产品没有价格,那么价格是否为空?
c) 如果组中有一个 Product 的 price 为 null 而其他的 Product 有 price,是否应该计为 0?

以下是获取每个组的较低价格总和的方法,暂时忽略 product_group_optional:

SELECT t2.group_id, sum(t2.new_price)
从
(
    选择 t.group_id,t.new_price
    从
    (
        选择 po.group_id, if(ifnull(pgo.product_id, true), p.price, 0) 作为 new_price
        FROM 产品 p,product_overview po
            左加入 product_group_optional pgo ON po.group_id = pgo.group_id
        其中 p.model_id = po.model_id
        按 po.group_id、new_price 订购
    ) 吨
    GROUP BY t.group_id
) t2

【讨论】:

  • 您好 Diogo,非常感谢您的帮助 a) 答案应该是 100。因为正如您在 A 组中看到的那样,有两个模型(模型 id 1 和 3)的值为 100。但我只想获得一次最小值。在 B 组中,最小值为 20,但由于 B 组是可选的(如您所见,表 product group optional 中有一条记录),然后价格自动设置为 0。这就是为什么总价值应为 100而不是 120 b) 如果产品没有价格,那么价格应该是 '0' c) 是的,它应该算作 0 :)
  • 如我所见,您的查询运行良好。最棘手的部分是当 group 设置为 optional 时将值变为 0。正如您所说,B 组将返回最小值 20。但我想将其设为 0,因为 B 是可选的。如果您对此有任何建议,那就太好了。再次感谢
  • 我自己想通了,没问题。感谢您的帮助。
  • 太棒了@savvas999。我已经编辑了 SQL。请试试这个。
  • 您好,我不知道为什么您的建议(针对可选组)不起作用,但我会在第一篇文章中发布我的解决方案,以防万一有人想知道 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-28
  • 2020-08-16
  • 1970-01-01
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多