2013-03-24 195 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进行重新编号。