从Mysql获取每个组中的最小值的总和

时间:2016-07-20 13:22:04

标签: php mysql sum min

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

我有以下表格:

产品

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的和。

但我不知道该怎么办。 我想在这个查询中完成它。

期望的输出

Sum of all groups
     100

有人能引导我走向正确的方向吗?

2 个答案:

答案 0 :(得分:2)

您可以使用以下查询:

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

答案 1 :(得分:1)

我不确定我是否了解你桌子的钥匙以及问题 问题很少。
a)答案应该是120? b)如果产品没有价格,则价格为空? c)如果组中的产品具有零价格而其他产品具有价格,是否应计为0?

以下是如何获得每组较低价格的总和,忽略product_group_optional for while:

SELECT t2.group_id, sum(t2.new_price)
FROM
(
    SELECT t.group_id, t.new_price
    FROM
    (
        SELECT po.group_id, if(ifnull(pgo.product_id, true), p.price, 0) as new_price
        FROM product p, product_overview po
            LEFT JOIN product_group_optional pgo ON po.group_id = pgo.group_id
        WHERE p.model_id = po.model_id
        ORDER by po.group_id, new_price
    ) t
    GROUP BY t.group_id
) t2