我正在写一个小的家庭库存更新,它改变了最早到期日的产品的数量(我实现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 bylimit

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的条件。

10-08 02:21