mySQL 使用 WHERE 进行更新

mySQL UPDATE with WHERE

我正在尝试在满足两个条件时将 p.product_status 更新为 0。

UPDATE product p JOIN product_to_store p2s ON p.product_id = p2s.product_id
SET p.status=0 
WHERE p.quantity=0 AND p2s.store_id=2

如果 p.product_id 在 p2s 中并分配给 p2s.store_id 2 它不应将 p.status 更新为 0.

product_id | store_id
         1 |        0
         1 |        2
         2 |        0
         3 |        0
         4 |        2

假设我在 product_to_store 中有上述数据。 所有人的产品数量(p.quantity=0)。

Alt 1. Product_id=1 和 4:SQL 不应将 p.status=0 更新为 product_id 1 也被分配给 store_id 0 和 2。

Alt 2. Product_id=2 和 3:SQL 应该将 p.status=0 更新为 product_id 2仅分配给 store_id 0(而不是 2)。

此查询仅更新分配给商店 0 或商店 2 的产品。

UPDATE product p
JOIN (
  SELECT product_id 
  FROM product_to_store p2s
  WHERE store_id IN (0, 2) /*not clear, if this is a requirement*/
  GROUP BY product_id 
  HAVING SUM(store_id IN (0, 2)) < 2 OR COUNT(*) = 1
) p2s USING (product_id)
SET p.status = 0
WHERE p.quantity = 0;

SUM()函数中的store_id IN (0, 2) returns true or false, 1 or 0. 因此我们检查这条语句为真的行数是否小于2。所以它要么在这家店里,要么在另一家店里,而不是在这家店里。

您不需要 JOIN,这应该会给出所需的结果:

UPDATE product p 
SET p.status=0
WHERE p.quantity=0
AND p.product_id IN (
  SELECT ps2.product_id
  FROM product_to_store p2s
  WHERE p2s.store_id=2
)

尽管这可能不是最有效的解决方案,具体取决于每个 table 中的记录数,匹配谓词并在索引中表示。

更新

为了适应重新定义的问题:

UPDATE product p 
SET p.status=0
WHERE p.quantity=0
AND p.product_id IN (
  SELECT ps2.product_id
  FROM product_to_store p2s_r
  LEFT JOIN product_to_store p2s_2
  ON p2s_r.product_id=p2s_2.product_id
  AND p2s_2.store_id=2
  WHERE p2s_r.store_id<>2
  AND p2s_r.product_id IS NOT NULL
  AND p2s_2.product_id IS NULL
)

这是对我有用的声明:

UPDATE product p 
SET p.status=0
WHERE p.quantity=0
AND p.product_id IN (
  SELECT p2s_r.product_id
  FROM product_to_store p2s_r
  LEFT JOIN product_to_store p2s_2
  ON p2s_r.product_id=p2s_2.product_id
  AND p2s_2.store_id=2
  WHERE p2s_r.store_id<>2
  AND p2s_r.product_id IS NOT NULL
  AND p2s_2.product_id IS NULL
)

感谢您的帮助!!!