我正在使用PHP/MySQL
,但只是在寻找伪代码
如何让用户更改项目列表显示的顺序?
假设用户将#4移至#1,我将#4更改为#0,然后将行(1-3)更改为1,使其为2-4,然后将#0更改为#1?
这是最好的方式吗?
更新:它是一个待办事项列表,我不会只是交换项目的顺序(即交换#1和#4,但将在其他人面前移动项目)
我有一个带有item_id,task,completed,order_id
的SQL数据库中的项目我需要更改它的order_id
答案 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。