首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >列为MIN的更新表

列为MIN的更新表
EN

Stack Overflow用户
提问于 2017-10-15 09:17:29
回答 3查看 67关注 0票数 2

我写的家庭库存的小更新,改变数量的产品,其中有最古老的有效期(我的方式,以实现FIFO)。下面是我试图执行的示例,但是没有运气。

代码语言:javascript
复制
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”被指定两次,既是“更新”的目标,也是单独的数据源。

有人能给我指明正确的方向吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-10-15 11:54:54

我只会用order bylimit

代码语言:javascript
复制
UPDATE stan
    SET Ilosc = Ilosc - 1
    WHERE id_product = 1
    ORDER BY Date_exp
    LIMIT 1;

这与您的方法相比有两个关键的优点。首先,它更简单,不需要任何黑客绕过MySQL对引用正在更新的表的限制。

第二,逻辑是正确的。您的代码可以更新产品id不是1的行,因为在外部查询中没有限制。具有不同产品ids的多个行可以具有相同的最小日期。

如果您不想采用这种方法(比如说,因为JOIN已经在UPDATE)中了),您可以这样做:

代码语言:javascript
复制
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

票数 0
EN

Stack Overflow用户

发布于 2017-10-15 09:40:49

如果在内部查询中引用表,MySQL不允许对该表执行更新/插入/删除。但是,解决方法是在子查询中使用临时表,如下所示:

代码语言:javascript
复制
UPDATE stan a
SET a.Ilosc=a.Ilosc-1
WHERE a.Date_exp =
(SELECT Date_exp from 
     (select min(date_exp) as date_exp 
      FROM stan 
      WHERE ID_Product=1) sta
);

希望能帮上忙。

票数 1
EN

Stack Overflow用户

发布于 2017-10-15 09:57:35

代码语言:javascript
复制
UPDATE A
SET A.COLUMN_NAME=VALUE
FROM TABLE_NAME A
INNER JOIN (SELECT MIN(COLUNN_NAME) FROM TABLE_NAME)  B ON (A.COLUMN_NAME=B.COLUMN_NAME);
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46753504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档