我正在写一个小的家庭库存更新,它改变了最早到期日的产品的数量(我实现FIFO的方法)。下面是我试图执行但没有成功的例子。
UPDATE stan
SET Ilosc=Ilosc-1
WHERE Date_exp=(SELECT MIN(Date_exp) AS Date_exp FROM stan as sta WHERE ID_Product=1)
以上示例以以下错误结束:
1093-表“stan”被指定了两次,既作为“UPDATE”的目标,又作为数据的单独源
有人能告诉我正确的方向吗?
最佳答案
我只需要使用order by
和limit
:
UPDATE stan
SET Ilosc = Ilosc - 1
WHERE id_product = 1
ORDER BY Date_exp
LIMIT 1;
与您的方法相比,这有两个关键优势。首先,它更简单,不需要任何黑客来绕过MySQLs对引用正在更新的表的限制。
其次,逻辑是正确的。您的代码可以更新产品id不是1的行,因为您在外部查询中没有限制。具有不同产品ID的多行可能具有相同的最小日期。
如果您不想采用这种方法(例如,因为您已经在
JOIN
中有一个UPDATE)
,您可以:UPDATE stan s JOIN
(SELECT id_product, MIN(Date_exp) as minde
FROM stan s2
WHERE id_product = 1
GROUP BY id_product
) s2
ON s.id_product = s2.id_product AND s.Date_exp = s2.minde
SET Ilosc = Ilosc - 1;
如果这是你的意图,我也可能会抛出一个
Ilosc > 0
的条件。