按 id 更新最近更新的行

Posted

技术标签:

【中文标题】按 id 更新最近更新的行【英文标题】:Update recently updated row by id 【发布时间】:2019-08-14 17:40:29 【问题描述】:

在我的 prestashop 数据库中,当有 0 数量时,我尝试更新默认产品属性。我检查quantity 是否为0,然后将default_on 设置为null。然后我尝试使用相同的id_product 设置另一个属性default_on,前提是quantity 大于0

我有 3 个问题:

    如何检查特定 id_product 是否只有 1 个结果?如果只有 1 个,我不想更新 default_on。 如何检查特定 id_product 的所有结果的数量 = 0?在这种情况下,我也不想更新 default_on。 如何为所有表制作这个?循环?
START TRANSACTION;
SET @update_id := 0;
UPDATE ps_product_attribute SET default_on = NULL, id_product = (SELECT @update_id := id_product)
WHERE `default_on` = 1 AND `quantity` = 0
LIMIT 1;

UPDATE ps_product_attribute SET default_on = 1
WHERE `id_product` = @update_id AND `quantity` > 0 AND `default_on` IS NULL
LIMIT 1;
COMMIT;

【问题讨论】:

【参考方案1】:

使用自联接获取具有多个结果的所有产品。

UPDATE ps_product_attribute AS t1
JOIN (
    SELECT id_product
    FROM ps_product_attribute
    GROUP BY id_product
    HAVING COUNT(*) > 1
) AS t2 ON t1.id_product = t2.id_product
SET default_on = CASE
    WHEN default_on = 1 AND quantity = 0 THEN NULL
    WHEN quantity > 0 AND default_on IS NULL THEN 1
    ELSE default_on -- leave the rest unchanged
END

【讨论】:

非常感谢,但又出现了新问题。可以有很多行具有相同的 id_product 但只有一行具有特定 id 的 default_on 可以设置为 1。【参考方案2】:

现在我尝试不同的方式: 1.将所有default_on设置为null 2. 将 id_product 组中数量 > 0 的第一个 id_product_attribute 的 default_on 设置为 1

问题是:所有属性都为0的其余产品如何处理?

UPDATE ps_product_attribute AS t1
JOIN (
    SELECT MIN(id_product_attribute) MinID
      FROM ps_product_attribute
    WHERE quantity > 0
      GROUP BY id_product
      HAVING COUNT(*) > 1
) AS t2 ON t1.id_product_attribute = t2.MinID
SET default_on = 1

【讨论】:

以上是关于按 id 更新最近更新的行的主要内容,如果未能解决你的问题,请参考以下文章

如何在所有行中按顺序更新组号

DB2 z/OS 按列表更新

带有子查询的 MySQL 条件更新

更新具有特定ID的行

如何更新 CSV 文件中的行

基于其他表中的行的 PLSQL 更新