2016-07-20 4 views
2

一部のモデルの最低価格を取得しようとしています。 各モデルは、製品に属する特定のグループに属します。Mysqlの各グループの最小値の合計を取得します

私は、次の表がありますいくつかのグループは、WHオプションとすることができ

製品

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の2つのグループがあります。 グループ最低価格の値は100です(model_id 1と3) グループBの最小価格の値は20(model_id 10)ですが、グループBはオプションなので最低価格の値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 
最小値の0

総合和であります

問題は、グループAの場合は200になりますが、100になるはずです。 最小値100、モデル1および3の2つのモデルがあります。これらは合計100 = 100 = 200と仮定します。

問題a)しかし、この値が何回存在しても、最小値を取るだけです。

発行b)はまた、私は、グループAとグループB

のこれら二つの出力SUMのSUMを取得しようとしています。しかし、私はそれを行う方法がわからないです。 私はそれがこのクエリで完了したいです。

所望の出力

Sum of all groups 
    100 

は、誰もが正しい方向に私をしてくださいつながることができますか?

+0

私はあなたが唯一つの値を得ることができるので、あなたは1を制限すべきだと思いますか? –

+0

こんにちはAhmad、私はそれを 'AND p.price ='の下の 'select query'で既に制限しようとしましたが、動作しません。 – shieldcy

+0

あなたのクエリでは、あなたの結合で 'attribute_id'を使用していますが、あなたの構造体のその列は言及していません – Philipp

答えて

1

を。
質問はほとんどありません。
a)回答は120にする必要がありますか?
b)製品に価格がない場合、価格はnullですか?
c)価格がnullで、価格が他のグループの製品がある場合は、0とカウントする必要がありますか?ここで

あなたはしばらくの間、product_group_optionalを無視して、各グループの低価格の合計を得ることができる方法です:

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
+0

こんにちはDiogo、助けをたくさんいただきありがとうございます a)答えは全体的に100になるはずです。グループAで見ることができるように、100という値を持つ2つのモデル(モデルID 1と3)がありますが、その最小値を1回取得したいだけです。 グループBでは、グループBがオプションであるため、最小値は20ですが(テーブル製品グループにレコードがあることがわかります)、価格は自動的に0に設定されます。 100ではなく120 b)製品に価格がない場合、価格は '0'である必要があります c)はい0と数えます。 – shieldcy

+0

ご覧のとおり、クエリは正常に動作します。最も難しいのは、グループがオプションに設定されているときに値を0にすることです。あなたが言ったように、グループBは最小値20を返しますが、Bはオプションなので0にします。これについての提案があれば素晴らしいでしょう。もう一度ありがとう – shieldcy

+0

私はそれを自分で考え出しました、問題ありません。助けてくれてありがとう。 – shieldcy

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 
+0

こんにちはGiorgos、提案に感謝します。それを試して、それが動作するかどうかをお知らせします – shieldcy

+0

ヘルプGiorgosのおかげで再び。それは私の望むように動作しませんでしたが、あなたの質問のいくつかのビットは、私が問題を解決するために多くの助けになりました。 – shieldcy

関連する問題