按 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 更新最近更新的行的主要内容,如果未能解决你的问题,请参考以下文章