0

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

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

假设用户将#4 移动到#1,我是否将#4 更改为#0,然后foreach 行(1-3) 将其增加1,所以它是2-4,然后将#0 更改为#1?

这是最好的方法吗?

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

我在 SQL db 中有 item_id、task、completed、order_id 的项目

我需要更改的是 order_id

4

3 回答 3

3

我认为你已经做对了:

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 > 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 > 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;
于 2013-03-24T13:19:56.120 回答
0

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

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

于 2013-03-24T12:22:10.247 回答
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。

于 2013-03-24T14:09:03.370 回答