You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修正SQL更新语句以按供应商配置天数停用久未更新的产品?

解决产品过期批量停用的SQL问题

你的问题出在重复查询供应商配置表以及日期函数的不一致上,我们来一步步修正:

原SQL的核心问题

  1. 你已经通过JOIN关联了astra_settings_automation表,但又在WHERE子句里用了相关子查询获取Days_Until_Clean_Stock,这不仅冗余,还可能因为供应商配置存在重复记录导致子查询返回多行,触发报错。
  2. 混用了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 15:02:36