OpenCart数据库执行UPDATE SQL查询时报错#1242问题求助
报错原因
你遇到的#1242 - Subquery returns more than 1 row错误,核心是赋值用的子查询对单个oc_order记录匹配到了多条oc_order_history记录:
OpenCart的oc_order_history表是订单状态变更流水表,同一个订单多次变更到order_status_id=5的状态是常见场景,子查询返回多条结果时,数据库无法确定用哪条记录的date_added赋值,因此抛出错误。
修复方案
根据你的业务需求选择对应方案即可:
- 取订单第一次进入状态5的时间,用
MIN()聚合子查询结果:
UPDATE oc_order AS o SET o.date_added = ( SELECT MIN(date_added) FROM oc_order_history WHERE order_id = o.order_id AND order_status_id = 5)
- 取订单最后一次进入状态5的时间,用
MAX()聚合子查询结果:
UPDATE oc_order AS o SET o.date_added = ( SELECT MAX(date_added) FROM oc_order_history WHERE order_id = o.order_id AND order_status_id = 5)
- 仅需任意一条匹配记录的时间,给子查询加返回行数限制:
UPDATE oc_order AS o SET o.date_added = ( SELECT date_added FROM oc_order_history WHERE order_id = o.order_id AND order_status_id = 5 LIMIT 1)
如果需要避免没有匹配到状态5记录的订单date_added被更新为NULL,可以额外加EXISTS过滤条件,示例如下:
UPDATE oc_order AS o SET o.date_added = ( SELECT MAX(date_added) FROM oc_order_history WHERE order_id = o.order_id AND order_status_id = 5) WHERE EXISTS (SELECT 1 FROM oc_order_history WHERE order_id = o.order_id AND order_status_id = 5)
内容的提问来源于stack exchange,提问作者Syztemlord
相关产品推荐
相关产品推荐

