2012-05-02 53 views
3

說我5列idcatnameorder領域:用PHP更新mysql行的最佳策略是什麼?

+----+----------+-----+ 
| id | catname |order| 
+----+----------+-----+ 
| 1 | cat1  | 2 | 
| 2 | cat2  | 1 | 
| 3 | cat3  | 3 | 
| 4 | cat4  | 5 | 
| 5 | cat5  | 4 | 
+----+----------+-----+ 

,我想從一個數組更新這5個類別的順序,如:

array(1 => 3, 2 => 4, 3 => 5, 4 => 1, 5 => 2) 

什麼最佳實踐?使用數組中的相應順序來選擇每一行並更新訂單字段?或者創建一個包含所有這些類別的順序數組的新表,並使用它用於使用例如userid命令和使用連接語句鏈接兩個表?

+0

看看這個線程我的幫助: http://stackoverflow.com/questions/8532144/reordering-of-column-data-in-mysql –

回答

2

如果你想這樣做在一個查詢,您可以按如下所示生成SQL查詢(假設密鑰是現有的order值):

$orders = array(
    1 => 3, 
    2 => 4, 
    3 => 5, 
    4 => 1, 
    5 => 2, 
); 

$sql = 'UPDATE category SET order = CASE order '; 

foreach ($orders as $old => $new) { 
    $sql .= "WHEN $old THEN $new "; 
} 

$sql .= 'END'; 

如果密鑰是id條目,請使用CASE id而不是CASE order

+0

謝謝,但請注意,我的數組的意思是:key-> id value-> order not key-> old value-> new –

+0

OK,那麼在這種情況下,只需更改爲'CASE id'而不是'CASE order'。 – cmbuckley

+0

是的,這個解決方案是完美的 –

0

無論如何,將訂單數據放入行中將會比具有不同表格的連接更快。就更新而言,這並不重要 - 只要您有適當的索引。所以,我會用一個表的方法。

1

您可以用新訂單爲它們分配負值,然後將負值乘以-1。

array(1->-3,2->-4,3->-3,4->-1,5->-2) 

但你必須通過你的陣列循環更新行,每行本身:

update yourTable set order=-3 where order=1; 

,並隨後將

update yourTable set order=-1*order where order < 0; 
+0

爲什麼要使用-ve價值? –

+0

爲了避免兩次更新值,例如首先更新2-> 4,然後4-> 1,這意味着2-> 1。設置負值可以避免這種情況。 – mistapink

相關問題