【问题标题】:Query to check if grouped rows have value 1查询以检查分组行的值是否为 1
【发布时间】:2018-07-03 09:39:28
【问题描述】:

假设我有下表“产品”

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 的所有变体
  • 检查是否至少有一个 color=red 的变体具有 image = 1
  • 检查是否至少有一个 color=green 的变体具有 image = 1

=>

  • 如果 color=red 的变化没有 image = 1,则更新 id 为 13 的产品,设置 missing_images = 1

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

【问题讨论】:

  • 同时指定预期结果。并向我们​​展示您当前的查询尝试。
  • 我没有完全按照你的要求。通过向我们展示您的预期输出,您可以澄清您的问题。
  • “variations”的image字段是bool还是int?
  • variations.image 实际上是 int

标签: mysql sql


【解决方案1】:

可能是这个?

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

【讨论】:

    【解决方案2】:

    您可以计算图像的颜色数量和总体数量。这提供了一个表达式来确定是否有任何颜色缺少图像:

    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;
    

    【讨论】:

    • 不幸的是,这似乎还不起作用..什么是“product_missing”?看起来你可能在那里混合了一些东西..
    • @cn313 . . . “似乎不起作用”是什么意思?这是非常模糊的。
    • 它在“字段列表”中显示未知列“v.v”
    猜你喜欢
    • 2020-07-23
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    • 1970-01-01
    • 2020-02-04
    相关资源
    最近更新 更多