【问题标题】:How to change the order of a list?如何更改列表的顺序?
【发布时间】:2013-03-24 12:08:46
【问题描述】:

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

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

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

这是最好的方法吗?

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

我在 SQL 数据库中拥有 item_id、task、completed、order_id 的项目

我需要更改的是 order_id

【问题讨论】:

  • 我们真的cantsay..
  • 我想更好地解释您的需求可能会帮助我们更快地帮助您:)

标签: php mysql arrays loops


【解决方案1】:

我想你已经猜对了:

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 =&gt; null, 2 =&gt; 1, 3 =&gt; 2, 4 =&gt; 3, 5 =&gt; 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;

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 好吧,从技术上讲,您将使用 array_slice 和 array_merge,但该页面有一个如何做到这一点的示例。
    • 谢谢,我将使用 jQuery,但您是否建议从数据库中删除所有行,然后在重新排序后重新添加它们(我可能会使用 AJAX)
    • 不,当涉及到数据库时,不要做任何删除,只需为每个更改的记录更新每个记录的新索引。按您想要的顺序获取数组(php 方法是设置一个新数组并弹出或推送值,直到您将它们放在正确的位置,否则,使用我链接的示例),然后只在数组上进行 foreach 和使用像UPDATE mytable SET position='$index' WHERE id='$id' 这样的查询当然,这是一个过于简单的例子,因为你会使用准备好的语句或其他防止sql注入的方法。
    • 顺便说一句,php可以在php中使用javascript数组,只要它是json编码并且你使用json_decode。此外,您不需要检查更新是否不同,因为如果值相同,mysql 将忽略更新。
    • 最好让数据库进行排序,当您已经在使用它时。在客户端时,使用 JavaScript 进行排序,但如果要存储订单,则必须再次在 SQL 中执行此操作。请参阅下面的答案。
    【解决方案3】:

    假设您要将 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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-18
      • 1970-01-01
      • 2022-12-04
      • 2011-07-24
      • 2011-04-15
      • 2021-01-26
      相关资源
      最近更新 更多