在php和MySQL中处理数字列表

在php和MySQL中处理数字列表,php,mysql,list,Php,Mysql,List,我正在写一个小列表系统,它是通过数据库中的一个数字字段排序的,这个字段是动态的 数据库包含以下内容: Id | position | person ====================== 1 | 3 | John 2 | 1 | Jane 3 | 4 | David 4 | 2 | Emily 现在,当我选择该列表时,我通过position字段对其进行排序。 我想做的是通过后端管理这个订单,虽然我有一个主要的原则,但我正

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

数据库包含以下内容:

Id | position | person 
======================
1  | 3        | John 
2  | 1        | Jane
3  | 4        | David
4  | 2        | Emily
现在,当我选择该列表时,我通过position字段对其进行排序。 我想做的是通过后端管理这个订单,虽然我有一个主要的原则,但我正在努力解决的一件事是,有人更新说Emily为3,而没有更改该订单列表中的其他人

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

我想设法解决这个问题,但似乎无法掌握任何可能的方法,因为所有内容都将立即保存,因此无法确定哪个项目已更改,因此在出现重复的情况下应该是正确的


有什么想法吗?

我就这样分类:

...order by position, person
这样,具有相同“职位”的人员仍然可以可靠地(按姓名)排序。将“修复”留给用户


当然,处理这一问题的最佳方法是根本不用“位置”字段来打扰用户,而是使用某种列表。

如果您想将Emily从列表中向下移动,则她的位置2变为3。 所以你需要把3移回2(这是艾米丽的位置)

这同样适用于向上移动列表。您基本上是在交换下一条/上一条记录的位置。但您需要检查是否有可交换的记录

伪代码下移:

  • 接艾米丽
  • 更新Emily下方的记录(Emily的职位+1)
  • 如果更新正常-更新Emily位置

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

    for i in new pos+1..old pos
        pos[i]++
    

    下面是我使用的一个示例
    首先,我更改行的位置,让我们使用
    calendar\u event\u id=7
    作为示例,然后调用resposition,运行:

    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(日历事件\u id=7,0,1),
    part

    或:更新表集位置=位置+1,其中位置介于2和10之间,id=是的!我怎么没有想到这一点需要注意的一点是,表单中的“post”数据将获得所有数字位置的原始数据转储。只需重新排序就行了,因为它如何知道发生了什么变化而不首先请求数据库。我当然可以这样做,但这似乎远远不够优雅。不幸的是,其他显示逻辑和要求在很大程度上取决于数字而不是名称。我有点不同意。因为你可以进入一个每个人都有相同位置的位置,所以移动的人永远不会改变顺序,因为它会默认为排序的人的名字。可拖动排序是一个很好的界面,但是后端仍然需要保存新的位置,否则列表顺序会在每次显示/使用时重置。但是我喜欢可拖动列表的想法,我可能会看看这个