2012-04-30 56 views
1

如果我有數據庫字段列表:自定義字段排序基於一個int

id order title 
1  3  This is a post 
2  1  This is another post 
3  2  This is also a post 
4  4  This is still a post 

而且我想改變的順序基於爲了這些。
如果我設置了ID#1到2的順序,我想將ID#3的順序設置爲3.
如果我將ID#4的順序設置爲1,我希望ID#1的順序爲4, id#2爲2,id#3爲3等。

我該怎麼做?我認爲它應該很簡單,但我無法弄清楚。
我已經搜查,但我不知道該怎麼尋找...

+0

無法理解這個問題!!!!!你提到'id'或'order'的那個ID –

+0

是的,對不起。我改變秩序。 – Patrik

+0

你試圖實現的過程是不可能的,因爲根據你的問題沒有指定模式。如果它是一個簡單的交換它可以完成,但這不能通過使用簡單的PHP來完成,這需要非常高的理解與人工智能 –

回答

3

您可以用兩個UPDATE語句做在SQL:

START TRANSACTION; 
SELECT order FROM t WHERE order BETWEEN $new_order AND $old_order FOR UPDATE; 

UPDATE t SET order = order + 1 WHERE order BETWEEN $new_order AND $old_order; 
UPDATE t SET order = $new_order WHERE id = $id; 

COMMIT; 

在這些更新,以防止併發的問題我已經鎖定了表(不過請注意,交易/鎖只適用於InnoDB的表)。

+0

像這樣? 'LOCK TABLES posts WRITE' – Patrik

+0

@Patrik:我顯示了一個鎖(使用['SELECT ... FOR UPDATE'](http://dev.mysql.com/doc/refman/5.0/en/innodb-locking -reads.html))在我更新的答案。請注意,只有InnoDB表可以被鎖定。 – eggyal

0

有兩種方式: 讀SQL doc和使用ORDER BY接近查詢

讀PHP doc和使用usort函數

1

首先,您必須找到$other_row,該值具有要重用的order值。然後改變每一行的值。

$id_to_set = 1; 
$order_to_set = 2; 

// Find the order that will need to be swapped 
$result = mysql_query("select order from xxx where id = $id_to_set"); 
$row = mysql_fetch_row($result); 
// Find the other row that will be modified 
$result = mysql_query("select id from xxx where order = $order_to_set"); 
$other_row = mysql_fetch_row($result); 

// Do the actual swapping 
mysql_query("update xxxx set order = $order_to_set where id = $id_to_set"); 
mysql_query("update xxxx set order = " . $row['order'] . " where id = " . $other_row['id']); 
相關問題