1

有很多关于连接两个表的信息,但是我对 Select 不感兴趣,但对 Update 不感兴趣(这个也没有帮助:用其他两个表中的值更新表中的列)。

我需要在 Magento 中订购属性。我打算这样做的方式是:有两个相关的表(eav_attribute_option 和 eav_attribute_option_values)。它们由option_id加入。我需要根据eav_attribute_option_values表(列)中的字母顺序更新eav_attribute_option表中的sort_order字段。

我到目前为止是这样的:

SELECT *
FROM eav_attribute_option_value, eav_attribute_option
WHERE eav_attribute_option_value.option_id = eav_attribute_option.option_id    
ORDER BY value  

我得到:

value_id option_id store_id value    option_id_1  attribute_id  sort_order
13534      5681     0   ADULT               5681          131           0
13543      5710     0   Yellow              5710          134           0
13547      502      0   Yellow - 10A         502          127           0
13548      3001     0   Yellow - 120cm      3001          127           0
13549      503      0   Yellow - 12A         503          127           0

通过以下查询,我看到了我需要的东西:

SELECT t.*, @i:=@i+1 AS iterator
FROM (SELECT value, eav_attribute_option.option_id
FROM eav_attribute_option_value, eav_attribute_option
WHERE eav_attribute_option_value.option_id = eav_attribute_option.option_id 
ORDER BY value) t,(SELECT @i:=0) foo

我明白了:

value           option_id   iterator
ADULT           5681        1
Yellow          5710        2
Yellow - 10A    502         3
Yellow - 120cm  3001        4
Yellow - 12A    503         5
Yellow - 14A    504         6

最大的问题: 如何使用“迭代器”列中的值更新 eav_attribute_option 中的 sort_order 列,并将 option_id 作为链接字段?

从 eav_attribute_option 中选择 *

option_id   attribute_id    sort_order
1            18             0
2            18             1
3            127            0
4            127            0
5            127            0
6            127            0

我从这里得到“迭代器”查询:使用 MySQL,如何生成包含表中记录索引的列?

编辑:这是答案

UPDATE eav_attribute_option, (SELECT t.*, @i:=@i+1 AS iterator 
FROM 
(SELECT value, eav_attribute_option.option_id 
    FROM eav_attribute_option_value, eav_attribute_option 
    WHERE eav_attribute_option_value.option_id = eav_attribute_option.option_id 
    ORDER BY value) t,(SELECT @i:=0) x) tbl2 
SET eav_attribute_option.sort_order = tbl2.iterator 
WHERE eav_attribute_option.option_id = tbl2.option_id 
4

2 回答 2

1

您需要使用存储过程或视图。生成迭代器时,单个更新命令将无法执行您需要的操作,并且该组合是您需要访问以更新 eav_attribute_option 表的表格数据。

使用 SP 为迭代器查询创建一个游标并循环遍历它以使用简单的 where 更新 eav_attribute_option 表的 sort_order 列。

使用视图,您需要为迭代器查询创建一个视图。然后您可以使用此视图名称加入 eav_attribute_option 表并给出相关的更新命令。

我将推荐 SP 方法,因为当数据发生变化并对数据库服务器施加负载时,视图会不断更新。

于 2012-05-16T15:01:29.707 回答
1
UPDATE eav_attribute_option, (SELECT t.*, @i:=@i+1 AS iterator 
FROM 
(SELECT value, eav_attribute_option.option_id 
    FROM eav_attribute_option_value, eav_attribute_option 
    WHERE eav_attribute_option_value.option_id = eav_attribute_option.option_id 
    ORDER BY value) t,(SELECT @i:=0) x) tbl2 
SET eav_attribute_option.sort_order = tbl2.iterator 
WHERE eav_attribute_option.option_id = tbl2.option_id 
于 2012-05-17T08:41:23.677 回答