如何更改列表的顺序?
我正在使用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