2016-04-30 59 views
0

我有一个名为products的表,它包含所有产品,例如T恤和product_variants,它们具有相关的颜色变体,例如。黑色,蓝色,绿色,每个都有stock列 - 保留剩下的股票数量。MySQL - 如果在选择多行列值

我想建立一个查询,可以告诉我哪些产品完全售罄,哪些不是。

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. Group by 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和答案。

取而代之的是,它应该检查所有的变体行,看看它们中的任何一个还没有soldOut(使用上面的if语句),然后返回该产品的最终答案。

我做了什么错了,怎么能做到这一点呢?

回答

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)以及对于最后一列。

+0

谢谢!给了我一种思考的新方式。 – Karem