我正在使用PHP/MySQL
,但只是尋找僞代碼如何更改列表的順序?
我該如何允許用戶更改項目列表顯示的順序?
假設用戶將#4移動到#1是否將#4更改爲#0,然後每行(1-3)將其增加1,這樣它就是2-4,然後將#0更改爲#1?
這是最好的方法嗎?
更新:它是一個待辦事項列表,我將不只是交換項目的順序(即交換#1和#4,但在別人面前會移動的物品)
我有在ITEM_ID一個SQL數據庫中的項目,任務完成後,ORDER_ID
它ORDER_ID,我需要改變
我正在使用PHP/MySQL
,但只是尋找僞代碼如何更改列表的順序?
我該如何允許用戶更改項目列表顯示的順序?
假設用戶將#4移動到#1是否將#4更改爲#0,然後每行(1-3)將其增加1,這樣它就是2-4,然後將#0更改爲#1?
這是最好的方法嗎?
更新:它是一個待辦事項列表,我將不只是交換項目的順序(即交換#1和#4,但在別人面前會移動的物品)
我有在ITEM_ID一個SQL數據庫中的項目,任務完成後,ORDER_ID
它ORDER_ID,我需要改變
我覺得你說得對已:
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;
我發現,它通常是最好的,如果可行的做用JavaScript(即jQuery的)排序,因爲它可以防止每次用戶想要度假時都必須打到後端。
但是,如果你想使用PHP來做到這一點,我建議檢查array_push,array_pop等。他們可以完成你想要做的事情。一個例子見http://www.php.net/manual/en/function.array-push.php#56479。
好吧,從技術上講,你會使用array_slice和array_merge,但該頁面有一個如何做的例子它。 – starshine531 2013-03-24 12:26:15
謝謝,我將使用jQuery,但您會建議從數據庫中刪除所有行,然後在重新排序後重新添加它們(我可能會使用AJAX來執行此操作) – cantsay 2013-03-24 12:30:47
不,請勿在刪除時進行任何刪除它涉及到數據庫,只需更新每個記錄併爲每個更改的索引更新一次。根據需要獲取數組(PHP的方法是設置一個新數組,然後彈出或推出值,直到將它們放在正確的位置,否則使用我鏈接的示例),然後僅對數組進行foreach使用像UPDATE mytable SET位置='$ index'這樣的查詢WHERE id ='$ id''這是一個過於簡化的例子,當然,因爲您會使用準備好的語句或其他SQL注入預防方法。 – starshine531 2013-03-24 12:46:23
假設你想與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進行重新編號。
我們真的'cantsay' .. – 2013-03-24 12:11:01
我想解釋一下你需要什麼可能會幫助我們更快地幫助你:) – 2013-03-24 12:13:50