2013-03-24 182 views
0

我正在使用PHP/MySQL,但只是尋找僞代碼如何更改列表的順序?

我該如何允許用戶更改項目列表顯示的順序?

假設用戶將#4移動到#1是否將#4更改爲#0,然後每行(1-3)將其增加1,這樣它就是2-4,然後將#0更改爲#1?

這是最好的方法嗎?

更新:它是一個待辦事項列表,我將不只是交換項目的順序(即交換#1和#4,但在別人面前會移動的物品)

我有在ITEM_ID一個SQL數據庫中的項目,任務完成後,ORDER_ID

它ORDER_ID,我需要改變

+0

我們真的'cantsay' .. – 2013-03-24 12:11:01

+0

我想解釋一下你需要什麼可能會幫助我們更快地幫助你:) – 2013-03-24 12:13:50

回答

2

我覺得你說得對已:

UPDATE items SET order_id = 0 WHERE order_id = 4; 
UPDATE items SET order_id = order_id + 1 WHERE order_id >= 1 AND order_id < 4; 
UPDATE items SET order_id = 1 WHERE order_id = 0; 

要使用的order_id我將項目達位置j(I> j)的:

UPDATE items SET order_id = 0 WHERE order_id = i; 
UPDATE items SET order_id = order_id + 1 WHERE order_id >= j AND order_id < i; 
UPDATE items SET order_id = j WHERE order_id = 0; 

要使用的order_id我向下移動項目位置j(j> i)個:

UPDATE items SET order_id = 0 WHERE order_id = i; 
UPDATE items SET order_id = order_id - 1 WHERE order_id > i AND order_id <= j; 
UPDATE items SET order_id = j WHERE order_id = 0; 

另一種選擇是增加一個previous_sibling。假設你已經在列表加載的,所以你知道,以前的兄弟姐妹[1 => null, 2 => 1, 3 => 2, 4 => 3, 5 => 4]

UPDATE items SET previous_sibling = 3 WHERE id = 5; #previous_sibling of 4 
UPDATE items SET previous_sibling = null WHERE id = 4; # previous_sibling of 1 
UPDATE items SET previous_sibling = 4 WHERE id = 1; 
0

我發現,它通常是最好的,如果可行的做用JavaScript(即jQuery的)排序,因爲它可以防止每次用戶想要度假時都必須打到後端。

但是,如果你想使用PHP來做到這一點,我建議檢查array_push,array_pop等。他們可以完成你想要做的事情。一個例子見http://www.php.net/manual/en/function.array-push.php#56479

+0

好吧,從技術上講,你會使用array_slice和array_merge,但該頁面有一個如何做的例子它。 – starshine531 2013-03-24 12:26:15

+0

謝謝,我將使用jQuery,但您會建議從數據庫中刪除所有行,然後在重新排序後重新添加它們(我可能會使用AJAX來執行此操作) – cantsay 2013-03-24 12:30:47

+0

不,請勿在刪除時進行任何刪除它涉及到數據庫,只需更新每個記錄併爲每個更改的索引更新一次。根據需要獲取數組(PHP的方法是設置一個新數組,然後彈出或推出值,直到將它們放在正確的位置,否則使用我鏈接的示例),然後僅對數組進行foreach使用像UPDATE mytable SET位置='$ index'這樣的查詢WHERE id ='$ id''這是一個過於簡化的例子,當然,因爲您會使用準備好的語句或其他SQL注入預防方法。 – starshine531 2013-03-24 12:46:23

0

假設你想與ID $task_id任務設置爲$order_id

UPDATE `table` 
    SET order_id = order_id + 1 
WHERE order_id > $order_id; 

UPDATE `table` 
    SET order_id = $order_id 
WHERE task_id = $task_id; 

而只是爲了確保訂單ID始終是連續的且沒有間隙:

SELECT @numrow := 0; 

    UPDATE `table` 
    SET order_id = @numrow := @numrow + 1; 
ORDER BY order_id ASC; 

這將對所有訂單ID進行重新編號。