MySQL - 用于多行列值的SELECT中的IF

时间:2016-04-30 13:02:27

标签: mysql

我有一个名为products的表,其中包含所有产品,例如T-Shirt和product_variants,它们具有相关的颜色变体,例如。黑色,蓝色,绿色,每个都有stock列 - 保留剩余的库存数量。

我想构建一个查询,告诉我哪些产品已售完,哪些不是。

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. 按产品分组,每个产品仅显示一个结果。
  4. 选择product_id和IF(stock > 0 OR stock IS NULL, 'No', 'Yes') as SoldOUt
  5. 查询:

    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这个并回答。

    相反,它应该检查所有变量行并查看它们中是否还有soldOut(使用上面的if语句),然后返回该产品的最终答案。

    我做错了什么,如何实现?

1 个答案:

答案 0 :(得分:1)

首先,您不需要join,只需要汇总。

因此,这里有一种方法可以检查所有变体是0

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;

我猜你最后一栏也想要sum(pv.stock)