使用从MySQL中连接两个表获得的值更新列

时间:2012-05-16 14:32:42

标签: mysql magento

关于加入两个表有很多信息,但是我对Select不感兴趣,而是更新(这个也没有帮助:Update a column in a table with values from two other tables)。

我需要在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

最大的问题: 如何使用“iterator”列中的值更新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

我从这里得到了“iterator”查询:With MySQL, how can I generate a column containing the record index in a table?

编辑:这是答案

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 

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分: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