1

我正在编写一个小列表系统,它通过数据库中的动态数字字段进行排序

该数据库包含以下内容:

Id | position | person 
======================
1  | 3        | John 
2  | 1        | Jane
3  | 4        | David
4  | 2        | Emily

现在,当我选择该列表时,我通过位置字段对其进行排序。我想要做的是通过后端管理这个订单,虽然我已经掌握了主要原则,但我正在努力解决的一件事是有人将 Emily 更新为 3 而没有更改该有序列表中的其他人的情况。

因此,更新订单的页面只有人员姓名和一个包含当前订单的文本框。

我想尝试找出一种方法来处理这个问题,但似乎无法掌握任何可能的方法来做到这一点,因为所有内容都将立即保存,因此无法确定哪个项目已更改,因此应该是正确的一个以防重复。

有任何想法吗?

4

4 回答 4

0

如果你想将 Emily 向下移动列表,她的位置 2 变为 3。所以你需要将 3 移回 2(这是 Emilys 的位置)

向上移动列表也是如此。您基本上是在交换下一个/上一个记录的位置。但是您需要检查是否有要交换的记录。

伪代码下移:

  1. 得到艾米丽
  2. 更新Emily下面的记录(Emily的位置+1)
  3. 如果更新好了 - 更新艾米丽的位置
于 2012-07-17T08:24:17.877 回答
0

手动重新排序列表背后的一种逻辑是,只要一个列表位置发生变化,就对整个相关列表项进行重新排序。将 10 更改为 2 将需要从 2 到 9 的所有内容都向前推 +1 位置,因此逻辑是

for i in new pos+1..old pos
    pos[i]++
于 2012-07-17T08:24:57.933 回答
0

这是我
首先使用的示例,我更改了行的位置,让我们calendar_event_id = 7用作示例,然后我调用重新定位,它运行:

SET @position = 0;
UPDATE calendar_events SET position = @position := @position + 1 
WHERE position >= 0 
ORDER BY position, IF(calendar_event_id = 7, 0, 1), name

如果您删除了一行,则跳过该IF(calendar_event_id = 7, 0, 1),部分

于 2012-07-17T08:26:26.017 回答
0

我只是这样排序:

...order by position, person

这样,具有相同“位置”的人仍将被可靠地排序(按名称)。将“修复”留给用户。

当然,处理这个问题的最好方法是完全不用“位置”字段来打扰用户,而是使用某种可拖动的可排序列表。

于 2012-07-17T08:18:38.667 回答