2016-11-21 15 views
0

1つのテーブルに商品データが格納され、複数の割引価格設定を含む他の価格設定データがある2つのテーブル結合があります。一部の製品には単価が1つしかないため、すべての製品に価格表に複数のエントリがあるわけではありません。 私が理解しようとしているのは、製品に複数の価格設定があるかどうかを知らせるフラグを設定する方法です。mysql join最低価格設定フラグ

私が今使っているコード(下記参照)は、製品を返し、各製品の最低価格を見つけます。しかし、私が言ったように、すべての製品は「最低価格」を持っているわけではありません。私は、製品に付随する価格が単一単価か最低価格かを判断しようとしています。あなたの説明から

SELECT products.* 
    , products_pricing.* 
    FROM products 
    LEFT 
    JOIN products_pricing 
    ON products.product_id = products_pricing.product_id 
    LEFT 
    JOIN products_pricing AS filter 
    ON products_pricing.product_id = filter.product_id 
    AND products_pricing.qty_price > filter.qty_price 
WHERE filter.product_id IS NULL 
    AND products.product_active > 0 
ORDER 
    BY products.product_id DESC 
+1

に参加することができますしながら、 (私はMySQLに精通していませんが)製品をサブクエリすることはできますか?おそらくあなたがサブクエリーに参加するこのようなものか、これをあなたが参加する「ビュー」として保存しますか? SELECT \t MIN(PRICE)、 CASE WHEN COUNT(*)= 1 ELSE THEN 1 END 0 SINGLE_PRICE 望ましい結果がどのように見えるかPRODUCT_ID – Sean

+0

BY製品からの GROUP AS?さらに良い方法は、http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple- sql-query – Strawberry

答えて

0

私はすべての製品がproducts_pricingに少なくとも一つの価格を持っているので、外の必要は参加しないことを集めます。

アンチ・ジョイント・パターンを使用するのではなく、単に集約した製品と結合するだけです。あなたの旗に到達するには、最小/最大または数の比較を使用してください。

select 
    p.*, 
    pp.*, 
    case when ppm.min_qty_price = ppm.max_qty_price then 'single' else 'multi' end as flag 
from products p 
join products_pricing pp on pp.product_id = p.product_id 
join 
(
    select product_id, min(qty_price) as min_qty_price, max(qty_price) as max_qty_price 
    from products_pricing 
    group by product_id 
) ppm on ppm.product_id = pp.product_id 
     and ppm.min_qty_price = pp.qty_price 
where p.product_active > 0 
order by p.product_id desc; 
+0

ここに新しく、確かにそれが大丈夫だと言っても大丈夫なのかどうかわかりません。これは私が必要としたもので、完璧に働きました。 – NTFM

0

すべての二つのテーブルから列だけで関連する列を必要dpn't場合

SELECT products.product_id, count(*) as num_of_price 
    , case when count(*) > 1 then 'MULTI PRICE' ELSE 'SINGLE PRICE' as flag_price 
    FROM products 
    LEFT 
    JOIN products_pricing 
    ON products.product_id = products_pricing.product_id 
WHERE products.product_active > 0 
    GROUP BY products.product_id 
ORDER 
    BY products.product_id DESC 

あなたはすべての列が必要な場合は、この結果

SELECT products.* 
    , products_pricing.* 
    , t.* 
    FROM products 
    LEFT JOIN products_pricing ON products.product_id = products_pricing.product_id 
    LEFT JOIN (
     SELECT products.product_id, count(*) as num_of_price 
     , case when count(*) > 1 then 'MULTI PRICE' ELSE 'SINGLE PRICE' as flag_price 
     FROM products 
     LEFT 
     JOIN products_pricing 
     ON products.product_id = products_pricing.product_id 
    WHERE products.product_active > 0 
     GROUP BY products.product_id 
    ) T ON products.product_id = T.product_id 
ORDER 
    BY products.product_id DESC 
関連する問題