我想基于ID将magento属性的值从一行复制到同一个表中的另一行,但前提是目标列为空。
我有一个值attribute_id = 99这是价格,例如19.99,我想将这个值复制到一个新属性(这是attribute_id = 1030)我的测试查询下面工作正常并更新entity_id = 1030的行(这是每个产品ID)我不希望手动更改该数字我希望查询更新所有没有在attribute_id = 1013中使用attribute_id = 99的值的产品
UPDATE catalog_product_entity_decimal
SET value = (select value from (select value from catalog_product_entity_decimal where attribute_id = 99 AND entity_id = 1030) AS x)
WHERE attribute_id = 1013 AND attribute_id IS NULL AND entity_id = 1030;
实际上我希望entity_id = xxxx匹配,因为它可以通过表更新所有项目。例如1030,1031,1032 ... 1099 ... 15001
答案 0 :(得分:0)
我在这里假设了几件事。如果它们不同,并导致我的解决方案不起作用,请通过评论告诉我:
catalog_product_entity_decimal的结构如下:
value_id(自动增量,主键),entity_type_id,attribute_id,entity_id,value
(attribute_id,entity_id)有一个唯一约束。即同一个attribute_id,entity_id对只能存在一次。
你想要的是一个insert ignore语句:
INSERT IGNORE INTO catalog_product_entity_decimal (entity_id, attribute_id, value)
SELECT entity_id, :new_attribute_id as `attribute_id`, value
FROM catalog_product_entity_decimal
WHERE entity_id = :entity_id
AND attribute_id = :attibute_id
其中:new_attribute_id == 1030和:attribute_id == 99,而entity_id指的是您要为其创建新属性的任何产品实体。
另外,(这超出了问题的范围)我建议你更新catalog_product_entity中为你要添加属性的所有产品的“updated_at”列,因为如果你通过magento进行更新过程orm,它会自动记录catalog_product实例的更新时间。
你可以用非常简单的方式做到这一点。
创建一个程序:
将在attribute_id = 1030上过滤的catalog_product_entity_decimal表转储到临时表(temp1
)
运行此回答中提供的插入查询
将catalog_product_entity_decimal表转储到第二个临时表(temp2
)
更新catalog_product_entity p 在temp2.entity_id = p.entity_id上加入temp2 在temp1.entity_id = p.entity_id上LEFT JOIN temp1 SET p.updated_at = NOW() 其中temp1.entity_id为null