Magento2如何基于关联查询结果更新catalog_product_entity_int表
解决方案
方案1:无需临时表,直接使用多表关联更新
MySQL原生支持UPDATE多表关联语法,可以直接基于你现有的查询逻辑完成更新,不需要额外创建临时表,写法更简洁高效:
UPDATE catalog_product_entity_int cpei INNER JOIN catalog_product_relation cpr ON cpr.parent_id = cpei.entity_id INNER JOIN catalog_product_entity cpe ON cpe.entity_id = cpr.parent_id INNER JOIN catalog_product_flat_1 cpf1 ON cpf1.entity_id = cpr.child_id SET cpei.value = 1 WHERE cpei.attribute_id = '579' AND cpe.type_id = 'configurable' AND cpf1.special_price > 1 GROUP BY cpr.parent_id;
注意:执行更新操作前建议先把UPDATE语句替换为SELECT COUNT(*)校验符合更新条件的行数是否符合预期,同时做好相关表的数据备份,避免误操作
方案2:使用临时表的实现方式
如果需要先把筛选结果落地校验、或者需要多次使用筛选结果,可以选择临时表方案,步骤如下:
- 第一步:创建临时表存储符合条件的父商品ID
CREATE TEMPORARY TABLE temp_valid_parent_ids ( parent_id INT PRIMARY KEY ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
- 第二步:把符合条件的parent_id写入临时表
INSERT INTO temp_valid_parent_ids (parent_id) SELECT DISTINCT cpr.parent_id FROM catalog_product_entity cpe LEFT JOIN catalog_product_relation cpr ON cpe.entity_id = cpr.parent_id LEFT JOIN catalog_product_flat_1 cpf1 ON cpf1.entity_id = cpr.child_id WHERE cpe.type_id = 'configurable' AND cpf1.special_price > 1 GROUP BY cpr.parent_id;
- 第三步:基于临时表执行更新
UPDATE catalog_product_entity_int cpei INNER JOIN temp_valid_parent_ids tvpi ON tvpi.parent_id = cpei.entity_id SET cpei.value = 1 WHERE cpei.attribute_id = '579';
- 第四步:(可选)用完后可手动删除临时表,临时表也会在当前数据库连接断开后自动删除
DROP TEMPORARY TABLE IF EXISTS temp_valid_parent_ids;
内容的提问来源于stack exchange,提问作者Martin Leeney
相关产品推荐
相关产品推荐

