2017-11-13 15 views
0

最も安い価格で商品をお選びください。 グループ内のすべての製品の価格が異なる場合、私は最も安い製品を手に入れることができましたが、グループ内のすべての製品が同じ価格を持っていれば、機能しません。したがって商品がグループの場合、最も安い価格で商品を選択してください

私は、制限結合で余分なフィルタを追加するのに助けが必要です。

http://sqlfiddle.com/#!9/f9b16c/6

I have created a sample here.

SELECT 
    p.id, p.price 
FROM 
    product p 
     JOIN 
    (SELECT 
     product_group_id, MIN(price) AS price 
    FROM 
     product 
    GROUP BY product_group_id 

    ) AS inp ON p.product_group_id = inp.product_group_id 
     AND p.price = inp.price; 

サンプル・データ

ID |価格| | sku |

'58', '2800.0000', '1-67-131-72', '44' 
'60', '3688.0000', '8-105-82-72', '30' 
'61', '2750.0000', '9-105-82-72', '31' 
'62', '3400.0000', '10-67-131-72', '45' 
'189', '3530.0000', '7-113-114-115', '29' 
'190', '3050.0000', '7-113-114-72', '29' 
'193', '2980.0000', '7-105-114-115', '29' 
'194', '2500.0000', '7-105-114-72', '29' 
'196', '4699.0000', '8-116-114-115', '30' 
'199', '4069.0000', '8-116-82-72', '30' 
'200', '4318.0000', '8-105-114-115', '30' 
'205', '3910.0000', '9-117-82-115', '31' 
'206', '3230.0000', '9-117-82-72', '31' 
'207', '3580.0000', '9-105-114-115', '31' 
'256', '3550.0000', '1-135-136-137', '44' 
'257', '3070.0000', '1-135-136-72', '44' 
'258', '3400.0000', '1-135-131-137', '44' 
'259', '2920.0000', '1-135-131-72', '44' 
'260', '3430.0000', '1-67-136-137', '44' 
'261', '2950.0000', '1-67-136-72', '44' 
'262', '3280.0000', '1-67-131-137', '44' 
'263', '3880.0000', '10-67-131-137', '45' 
'292', '8750.0000', 'HobartAUPs-117-137', '53' 
'293', '8750.0000', 'HobartAUP-69-72', '53' 
'294', '8750.0000', 'HobartAUP-69-137', '53' 
'295', '8750.0000', 'HobartAUP-117-72', '53' 

望ましい結果

IDをproduct_group_id |価格

'194', '2500.0000' 
'61', '2750.0000' 
'58', '2800.0000' 
'62', '3400.0000' 
'60', '3688.0000' 
'292', '8750.0000' 
+0

あなたは、「製品が最小の価格で」ではなく「それらはすべて同じ価格を持っている場合、それは動作しません」と述べた - あなたは、彼らが同じ価格を持っている場合、クエリが返すことを期待しますので、どのような?あなたはどのようにして99p全部である「1つの正しい製品」を選んでいますか? –

+0

一部のグループには60p、65p、および55pの製品があり、1つのグループは99pとしてすべての製品を持っています。コードは第1グループでは動作しますが、第2には動作しません。 – Faraz

+0

あなたは私を受け入れていません。あなたは同じグループの99p、llである1000の製品を持っています。そして、あなたは "私が最低の価格を持っているが、データベースが私に1000を与えた1つの製品を求めました。すべての製品は最低価格で、すべての製品を手に入れました。最低価格を持つ複数の製品がある場合に1つの製品だけを取得するというアイデアを放棄するか、またはデータベースがその中から1つを選択できるようにするロジックを考える必要があります。あなたのポケットに99pがある場合、どのように99pの卵、99pのパンまたは99pの牛乳を購入することにしますか? –

答えて

1

私が正しく理解すれば、最低価格で1行しか得られません。したがって、グループ内で同じ価格の行が複数ある場合は、必要な行を決定する必要があります。おそらく、最小idで:

select min(p.id) as id, 
    p.price 
from product p 
join (
    select product_group_id, 
     min(price) as price 
    from product 
    group by product_group_id 
    ) as inp 
on p.product_group_id = inp.product_group_id 
    and p.price = inp.price 
group by p.price, p.product_group_id; 
+0

うまく動作します。私は実際のDB上でこの解決策をチェックし、フィードバックを与えます。 – Faraz

+0

サブクエリを捨て、HAVINGでそれを行うことができますか? –

+0

@CaiusJard私はHAVINGを使用してその解決法を知っていますが、これは2ヶ月前にHAVINGからこのソリューションに切り替えたこのソリューションに比べて非常に遅かったです。しかし、あなたの解決策を提案することをお気軽に – Faraz

関連する問題