2012-05-16 92 views
1

有很多關於加入兩個表的信息,但是我對選擇不感興趣,但更新(這個也沒有幫助:Update a column in a table with values from two other tables)。更新列與從MySQL中加入兩個表獲得的值

我需要在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:[email protected]+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作爲鏈接字段?

SELECT * FROM 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 

我從這裏的 「迭代」 查詢:With MySQL, how can I generate a column containing the record index in a table?

編輯:這裏的答案

UPDATE eav_attribute_option, (SELECT t.*, @i:[email protected]+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 
+0

它可以是這樣的: UPDATE eav_attribute_option,tbl2的 SET eav_attribute_option.sort_order = tbl2.iterator WHERE eav_attribute_option.option_id = tbl2.option_id 我只是隨便用 「TBL2」 部分的麻煩。 .. – Mike

+0

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))tbl2 SET eav_attribute_option.sort_order = tbl2.iterator WHERE eav_attribute_option.option_id = tbl2.option_id – Mike

回答

1
UPDATE eav_attribute_option, (SELECT t.*, @i:[email protected]+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 
1

您需要使用存儲過程或一個視圖。在生成迭代器時,單個更新命令無法執行您所需的操作,而組合是您需要訪問以更新eav_attribute_option表的表格數據。

使用SP爲迭代器查詢創建一個遊標並遍歷它以使用簡單的where來更新eav_attribute_option表的sort_order列。

使用視圖,您需要爲迭代器查詢創建一個視圖。然後,您可以使用此視圖名稱來加入eav_attribute_option表並提供相關的更新命令。

我會推薦SP方法,因爲視圖會在數據更改並對數據庫服務器造成負擔時不斷更新。

+0

謝謝。我設法讓它與我作爲評論發佈的查詢一起工作。 至於視圖,我的印象是,它們只是代表服務器執行時的負載,即與執行查詢相同,而不是調用視圖的名稱。 無論如何,我想避免意見,以便在MySQL服務器的變化保持在最低限度。我寧願每隔一段時間執行一次sql命令以保持條目有組織。謝謝 – Mike

+0

驚人的解決方案!當我發佈安全解決方案時,我沒有與我一起嘗試的查詢工具。做得好! – somnath