使用连接 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 大于 eid 的情况。这自然意味着 e 是其各自 entity_id.

中具有最大 row_id 的行