如何更改列表的顺序?

时间:2013-03-24 12:08:46

标签: php mysql arrays loops

我正在使用PHP/MySQL,但只是在寻找伪代码

如何让用户更改项目列表显示的顺序?

假设用户将#4移至#1,我将#4更改为#0,然后将行(1-3)更改为1,使其为2-4,然后将#0更改为#1?

这是最好的方式吗?

更新:它是一个待办事项列表,我不会只是交换项目的顺序(即交换#1和#4,但将在其他人面前移动项目)

我有一个带有item_id,task,completed,order_id

的SQL数据库中的项目

我需要更改它的order_id

3 个答案:

答案 0 :(得分: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 i的项目移动到位置j(i&gt; 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 i的项目移动到位置j(j&gt; 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;

答案 1 :(得分:0)

我发现通常最好使用javascript(即jquery)进行排序,如果可行的话,因为它可以防止每次用户想要求助时都必须点击后端。

但是,如果您想使用php来执行此操作,我建议您查看array_push,array_pop等。他们可以完成你想要做的事情。有关示例,请参阅http://www.php.net/manual/en/function.array-push.php#56479

答案 2 :(得分: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。