如何修正SQL更新语句以按供应商配置天数停用久未更新的产品?
解决产品过期批量停用的SQL问题
你的问题出在重复查询供应商配置表以及日期函数的不一致上,我们来一步步修正:
原SQL的核心问题
- 你已经通过
JOIN关联了astra_settings_automation表,但又在WHERE子句里用了相关子查询获取Days_Until_Clean_Stock,这不仅冗余,还可能因为供应商配置存在重复记录导致子查询返回多行,触发报错。 - 混用了
NOW()(带时分秒的datetime)和CURDATE()(仅日期),可能导致时间比较的逻辑偏差。
修正后的SQL语句
UPDATE products_ean p JOIN astra_settings_automation a ON a.id_supplier = p.id_supplier SET p.active = 0 WHERE -- 满足供应商自定义的过期天数条件 p.last_update < DATE_SUB(NOW(), INTERVAL a.Days_Until_Clean_Stock DAY) -- 同时满足全局的5天过期条件 AND p.last_update < DATE_SUB(NOW(), INTERVAL 5 DAY);
逻辑说明
- 直接使用
JOIN后得到的a.Days_Until_Clean_Stock,避免重复查询,提升性能同时避免子查询的潜在问题 - 统一用
NOW()作为时间基准,确保和last_update(datetime类型)的比较是一致的(如果你的last_update是仅日期类型,可以换成CURDATE()) - 两个条件用
AND连接,确保产品同时满足供应商自定义过期规则和全局的5天过期规则
额外注意事项
- 请确保
astra_settings_automation表中每个id_supplier只有一条记录,否则JOIN会导致产品被重复匹配(不过MySQL中UPDATE即使匹配多行,最终也只会更新一次,但会影响性能) - 可以先运行
SELECT语句验证筛选结果,确认无误后再执行UPDATE:
SELECT p.*, a.Days_Until_Clean_Stock FROM products_ean p JOIN astra_settings_automation a ON a.id_supplier = p.id_supplier WHERE p.last_update < DATE_SUB(NOW(), INTERVAL a.Days_Until_Clean_Stock DAY) AND p.last_update < DATE_SUB(NOW(), INTERVAL 5 DAY);
内容的提问来源于stack exchange,提问作者kroell
相关产品推荐
相关产品推荐

