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
)
感谢您的帮助!!!
我正在尝试在满足两个条件时将 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
)
感谢您的帮助!!!