2016-04-30 7 views
0

Tシャツなどのすべての商品を保持するテーブルproductsと、関連する色のバリエーションを持つproduct_variantsがあります。黒、青、緑の各列には、株式の数を保持するstock列があります。複数行の列値のSELECTのMySQL-IF

完全に売り切れている製品とそうでない製品のどちらを教えてくれるのかという質問を作成したいと思います。

stockの列は0でなければなりませんが、NULLまたは> 0の場合は在庫があります。 NULLは、無制限の数量がある場合に使用されます。

これは次の結果である私が取得したいと思います:

私はやってみました何
product_id|soldOut|stock 
------------------ 
1   |Yes |0 
2   |Yes |0 
3   |No  |NULL 
4   |No  |1 

、次のとおりである。

  1. グラブすべての製品
  2. product_variantsに参加してください
  3. グループごとに1つの結果のみを表示するproduct_id
  4. 選択PRODUCT_IDとIF(stock > 0 OR stock IS NULL, 'No', 'Yes') as SoldOUt

問合せ:

SELECT p.product_id, IF(pv.stock > 0 OR pv.stock IS NULL, 'No', 'Yes') as SoldOUt 
FROM products p 
JOIN product_variants pv ON (`pv`.`product_id` = `p`.`product_id`) 
GROUP BY p.product_id 

結果soldOutが正しくないということです - それはちょうど変種のランダムな行を取り、これのstockを確認するように思えるし、答え。

代わりに、すべてのバリアント行をチェックして、いずれかがまだsellOut(上記のifステートメントを使用していない)かどうかを確認し、その製品の最終回答を1つ返す必要があります。

私は何が間違っていますか?どのようにこれを達成できますか?

答えて

1

まず、join、集計だけは必要ありません。私はあなたにもsum(pv.stock)同様のための最後の列をしたいことを推測してい

select pv.product_id, 
     (case when sum(pv.stock = 0) = count(*) then 'Yes' else 'No' 
     end) as SoldOut 
from product_variants pv 
group by p.product_id; 

だから、ここですべての変異体は 0であることを確認し一つの方法です。

+0

ありがとうございました!思う新しい方法を与えてくれた。 – Karem

関連する問題