查询以检查分组行的值是否为

时间:2018-01-24 11:01:30

标签: mysql sql

假设我有下表“产品”

id |title|images_missing
13 |shoes| 0
14 |shirt| 0

和另一张表“变种”

id|product_id|color|size|image
1 |        13|red  |M   |0
2 |        13|red  |XL  |1
3 |        13|green|M   |0
3 |        13|green|S   |0

每个产品可以有多种变化(变化由颜色+大小定义)。

我需要一个查询来检查每种颜色,如果至少有一个变体有图像,并且如果至少有一种颜色没有图像(在本例中为绿色),则第一个表中的产品行需要获取丢失图像的值为1。

你能帮我解决这个问题吗?

编辑:

为了使事情更清晰,我的目标是更新产品表并将字段“images_missing”设置为1(=至少一种颜色根本没有图像)或0(=每种颜色)至少有一个变体与image = 1)

这意味着:

  • 使用product_id = 13
  • 获取所有变体
  • 检查颜色=红色的至少一个变体是否有image = 1
  • 检查颜色=绿色的至少一个变体是否有image = 1

=>

  • 如果color = red的变体没有image = 1,请更新ID为13的产品,设置missing_images = 1

OR

  • 如果color = green没有变化image = 1,请更新ID为13的产品,设置missing_images = 1

2 个答案:

答案 0 :(得分:1)

您可以使用图像和整体数量来计算颜色数。这提供了一个表达式,用于确定是否有任何颜色缺失图像:

select p.*,
       coalesce(v.images_missing, 0) as images_missing
from products p left join
     (select product_id, 1 as images_missing
      from variations v
      group by product_id
      having count(distinct color) <> count(distinct case when image = 1 then color end)
     ) v
     on p.id = v.product_id;

答案 1 :(得分:0)

可能是这个吗?

select p.id,p.title,count(1) images_missing
from products p
inner join 
(select product_id,color,sum(image) 
from variations
group by product_id,color
having sum(image)=0) as v 
on p.id = v.product_id
group by p.id,p.title