2017-10-12 109 views
0

我正在使用可排序的jQuery對我的表的行進行排序。新訂單保存在後端,我使用python,Django。我在我的數據庫中有一列叫做priority.在MySQL上多次更新而不覆蓋數據

這就是我如何處理後端的邏輯。最後一個數組是一個二維的名單基本上,我想下面的情況發生:

previous_order = [ 1,2,3,4,5 ] 
new_order = [3,4,5,1,2] 

orders_to_rearrange = [     ### gets passed in a function 
    [1,3], [2,4], [3,5], [4,1], [5,2] 
] 

### UPPDATE the following: 
### Priority 1 to become 3 
### Priority 2 to become 4 
### Priority 3 to become 5 
### Priority 4 to become 1 
### Priority 5 to become 1 

以上是一個糟糕的榜樣,但是當我遇到這樣一個複雜的開關:後

### Priority 5 to become 2 
### Priority 2 to become 4 
### Priority 4 to become 1 

注意如何5變成2,4變成2,以及5變成2。現在我最終得到兩個優先級2,因爲它覆蓋循環內的語句。

我雖然在MySQL中WHEN THEN case語句將有所幫助,但它最終會做同樣的事情,因爲我循環。

UPDATE my_table 
    SET priority = 
     CASE priority 
     %s 
     ELSE priority 
END 

注意:我有一個函數將我的二維數組轉換爲WHEN __ THEN __語句,並將替換該%s模式。

任何人都可以請給我一個建議,如何在一個語句中同時更新行,而不會覆蓋數據?

非常感謝!

+0

不是100%肯定你通過更新行,而不會覆蓋數據的意思,但我認爲你可能在使用案例陳述方面走在了正確的軌道上......至少就我理解的問題而言。 '更新MY_TABLE 設定的優先級=情況下,當優先級= 1,則3 \t \t \t \t \t \t \t \t \t \t \t當優先級= 2,則4 \t \t \t \t \t \t \t \t \t \t \t當優先級= 3然後5 \t \t \t \t \t \t \t \t \t \t當優先級= 4,則1 \t \t \t \t \t \t \t \t \t \t \t當優先級= 5然後1,否則優先端 其中優先> 0;'。 – JuveLeo1906

+0

嗨@ JuveLeo1906這將得到執行一行行或全部在同一時間?出於某種原因,當我刷新我的頁面時,訂單不會相應地保存。我不知道我的UPDATE語句中的哪個部分正在破壞。 – Marvin

+0

因爲它是一個語句,所以它會同時更新。也許你在刷新頁面之前缺少提交語句? – JuveLeo1906

回答

1

我認爲它可能只是固定case語句......除非我沒有理解錯的問題的問題:

update my_table 
    set priority = case when priority = 1 then 3 
         when priority = 2 then 4 
         when priority = 3 then 5 
         when priority = 4 then 1 
         when priority = 5 then 1 
         else priority end 
where priority > 0;