使用连接 Max 时更新多个表
Update multiple tables when using a join Max
这是我必须更新我的 Magento 2.0 mySQL 数据库中产品的定价和 updated_at 字段的查询。
SET @etype = (SELECT entity_type_id FROM eav_entity_type WHERE entity_type_code = 'catalog_product');
SET @price = (SELECT attribute_id FROM eav_attribute WHERE attribute_code = 'price' AND entity_type_id = @etype);
-- Admin store ID
SET @store = 0;
UPDATE catalog_product_entity_decimal d1
-- SELECT d1.row_id, d1.value AS 'Current', ip.sku, ip.price AS 'Updated', e.updated_at FROM catalog_product_entity_decimal d1
JOIN (SELECT MAX(row_id) AS rowid, sku, updated_at FROM catalog_product_entity GROUP BY entity_id) e ON (d1.row_id = e.rowid)
JOIN import_price ip ON e.sku = ip.sku
AND d1.store_id = @store
AND d1.attribute_id = @price
SET d1.value = ip.price, e.updated_at = NOW()
我收到错误 更新的目标 table e 不是 updatable
我明白为什么会收到错误消息,但我不知道如何解决。
如果我删除 , e.updated_at = NOW()
,查询工作正常。
这是table结构
CREATE TABLE prod23.catalog_product_entity (
row_id int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Version Id',
entity_id int(10) UNSIGNED NOT NULL COMMENT 'Entity Id',
created_in bigint(20) UNSIGNED NOT NULL DEFAULT 1 COMMENT 'Update Id',
updated_in bigint(20) UNSIGNED NOT NULL DEFAULT 2147483647 COMMENT 'Next Update Id',
attribute_set_id smallint(5) UNSIGNED NOT NULL DEFAULT 0 COMMENT 'Attribute Set ID',
type_id varchar(32) NOT NULL DEFAULT 'simple' COMMENT 'Type ID',
sku varchar(64) DEFAULT NULL COMMENT 'SKU',
has_options smallint(6) NOT NULL DEFAULT 0 COMMENT 'Has Options',
required_options smallint(5) UNSIGNED NOT NULL DEFAULT 0 COMMENT 'Required Options',
created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Creation Time',
updated_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Update Time',
PRIMARY KEY (row_id)
)
我假设您的目标是仅更新 catalog_product_entity
中每个 entity_id
中具有最大 rowid 的行,而其他行保持不变。
UPDATE catalog_product_entity_decimal d1
JOIN catalog_product_entity e ON d1.row_id = e.row_id
LEFT OUTER JOIN catalog_product_entity e2
ON e2.entity_id = e.entity_id AND e2.row_id > e.row_id
JOIN import_price ip ON e.sku = ip.sku
AND d1.store_id = @store
AND d1.attribute_id = @price
SET d1.value = ip.price, e.updated_at = NOW()
WHERE e2.row_id IS NULL;
连接到 e2
的目的是找到具有相同 entity_id
但更大 row_id
的另一行。条件 WHERE e2.row_id IS NULL
意味着我们只想要 e2
的行 row_id
大于 e
的 id
的情况。这自然意味着 e
是其各自 entity_id
.
中具有最大 row_id
的行
这是我必须更新我的 Magento 2.0 mySQL 数据库中产品的定价和 updated_at 字段的查询。
SET @etype = (SELECT entity_type_id FROM eav_entity_type WHERE entity_type_code = 'catalog_product');
SET @price = (SELECT attribute_id FROM eav_attribute WHERE attribute_code = 'price' AND entity_type_id = @etype);
-- Admin store ID
SET @store = 0;
UPDATE catalog_product_entity_decimal d1
-- SELECT d1.row_id, d1.value AS 'Current', ip.sku, ip.price AS 'Updated', e.updated_at FROM catalog_product_entity_decimal d1
JOIN (SELECT MAX(row_id) AS rowid, sku, updated_at FROM catalog_product_entity GROUP BY entity_id) e ON (d1.row_id = e.rowid)
JOIN import_price ip ON e.sku = ip.sku
AND d1.store_id = @store
AND d1.attribute_id = @price
SET d1.value = ip.price, e.updated_at = NOW()
我收到错误 更新的目标 table e 不是 updatable
我明白为什么会收到错误消息,但我不知道如何解决。
如果我删除 , e.updated_at = NOW()
,查询工作正常。
这是table结构
CREATE TABLE prod23.catalog_product_entity (
row_id int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Version Id',
entity_id int(10) UNSIGNED NOT NULL COMMENT 'Entity Id',
created_in bigint(20) UNSIGNED NOT NULL DEFAULT 1 COMMENT 'Update Id',
updated_in bigint(20) UNSIGNED NOT NULL DEFAULT 2147483647 COMMENT 'Next Update Id',
attribute_set_id smallint(5) UNSIGNED NOT NULL DEFAULT 0 COMMENT 'Attribute Set ID',
type_id varchar(32) NOT NULL DEFAULT 'simple' COMMENT 'Type ID',
sku varchar(64) DEFAULT NULL COMMENT 'SKU',
has_options smallint(6) NOT NULL DEFAULT 0 COMMENT 'Has Options',
required_options smallint(5) UNSIGNED NOT NULL DEFAULT 0 COMMENT 'Required Options',
created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Creation Time',
updated_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Update Time',
PRIMARY KEY (row_id)
)
我假设您的目标是仅更新 catalog_product_entity
中每个 entity_id
中具有最大 rowid 的行,而其他行保持不变。
UPDATE catalog_product_entity_decimal d1
JOIN catalog_product_entity e ON d1.row_id = e.row_id
LEFT OUTER JOIN catalog_product_entity e2
ON e2.entity_id = e.entity_id AND e2.row_id > e.row_id
JOIN import_price ip ON e.sku = ip.sku
AND d1.store_id = @store
AND d1.attribute_id = @price
SET d1.value = ip.price, e.updated_at = NOW()
WHERE e2.row_id IS NULL;
连接到 e2
的目的是找到具有相同 entity_id
但更大 row_id
的另一行。条件 WHERE e2.row_id IS NULL
意味着我们只想要 e2
的行 row_id
大于 e
的 id
的情况。这自然意味着 e
是其各自 entity_id
.
row_id
的行