Php 如何向表中添加新条目并更改其他条目的排序顺序

Php 如何向表中添加新条目并更改其他条目的排序顺序,php,mysql,sorting,Php,Mysql,Sorting,我正在创建一个论坛应用程序,我有一个存储类别的表。此表有3列: Category_Id | Category_Name | CategoryOrder 我有一个PHP脚本,它向数据库中添加了一个新的类别,其中包括选择类别显示的顺序。因此,例如,如果我在数据库中存储了5个类别,我想添加一个新类别,并使其成为CategoryOrder列中的第一个类别,这意味着其他类别的CategoryOrder必须更改 如果表中只有一个类别,我会将其更新为一个新值,并将1值分配给新类别。但是如果我有五排,我该怎么

我正在创建一个论坛应用程序,我有一个存储类别的表。此表有3列:

Category_Id | Category_Name | CategoryOrder
我有一个PHP脚本,它向数据库中添加了一个新的类别,其中包括选择类别显示的顺序。因此,例如,如果我在数据库中存储了5个类别,我想添加一个新类别,并使其成为
CategoryOrder
列中的第一个类别,这意味着其他类别的
CategoryOrder
必须更改


如果表中只有一个类别,我会将其更新为一个新值,并将
1
值分配给新类别。但是如果我有五排,我该怎么办呢。如何更改所有值以将
1
添加到其当前值?我不知道我在这里是否有意义。

首先尝试增加CategoryOrder

update categorytable set CategoryOrder = CategoryOrder + 1

然后插入CategoryOrder=1的新记录

尝试先增加CategoryOrder

update categorytable set CategoryOrder = CategoryOrder + 1

然后用CategoryOrder=1插入新记录

我这样做过几次。我现在找不到任何代码,所以我只发布一个算法(可能包含一些伪代码):

  • 插入新值(较简单的值):
    • 更新所有类别,这些类别比新插入的类别更大或与新插入的类别相同:
      更新类别集CategoryOrder=CategoryOrder+1,其中CategoryOrder>=$newCategory['order']
    • 插入您的新类别
  • 更新现有类别:
    • 检查新订单是否比以前大或小(如果相同,则无需执行任何操作…)
    • 如果较大,则更新比旧订单大且小于新订单的所有类别,并减去1:
      更新类别集CategoryOrder=CategoryOrder-1,其中CategoryOrder>$category['old_order']和CategoryOrder=new_order
      CategoryOrder
  • 应该是这样

    编辑:第二种情况的说明(更新):

    假设我们有这些条目:

    Category_Id | Category_Name | CategoryOrder
    1           | name_1        | 1
    2           | name_2        | 2
    3           | name_3        | 3
    4           | name_4        | 4
    5           | name_5        | 5
    
    现在我们要编辑顺序为
    2
    的类别,并将其更改为
    4
    。我们要做的是将顺序为
    3
    4
    的类别按一的顺序向下排列:

    Category_Id | Category_Name | CategoryOrder
    1           | name_1        | 1
    2           | name_2        | 2
    3           | name_3        | 2
    4           | name_4        | 3
    5           | name_5        | 5
    
    最后更新所需类别,并将其顺序更新为
    4

    Category_Id | Category_Name | CategoryOrder
    1           | name_1        | 1
    3           | name_3        | 2
    4           | name_4        | 3
    2           | name_2        | 4
    5           | name_5        | 5
    
    现在清楚了吗?

    现在,如果我们想将订单
    5
    的类别更改为第一个,该怎么办?更新所有具有顺序>=
    1
    5
    <的类别,并将顺序设置为
    +1

    Category_Id | Category_Name | CategoryOrder
    1           | name_1        | 2
    3           | name_3        | 3
    4           | name_4        | 4
    2           | name_2        | 5
    5           | name_5        | 5
    
    最后更新所需的类别:

    Category_Id | Category_Name | CategoryOrder
    5           | name_5        | 1
    1           | name_1        | 2
    3           | name_3        | 3
    4           | name_4        | 4
    2           | name_2        | 5
    

    (注意类别是按顺序和id排序的)

    我这样做过几次。我现在找不到任何代码,所以我只发布一个算法(可能包含一些伪代码):

  • 插入新值(较简单的值):
    • 更新所有类别,这些类别比新插入的类别更大或与新插入的类别相同:
      更新类别集CategoryOrder=CategoryOrder+1,其中CategoryOrder>=$newCategory['order']
    • 插入您的新类别
  • 更新现有类别:
    • 检查新订单是否比以前大或小(如果相同,则无需执行任何操作…)
    • 如果较大,则更新比旧订单大且小于新订单的所有类别,并减去1:
      更新类别集CategoryOrder=CategoryOrder-1,其中CategoryOrder>$category['old_order']和CategoryOrder=new_order
      CategoryOrder
  • 应该是这样

    编辑:第二种情况的说明(更新):

    假设我们有这些条目:

    Category_Id | Category_Name | CategoryOrder
    1           | name_1        | 1
    2           | name_2        | 2
    3           | name_3        | 3
    4           | name_4        | 4
    5           | name_5        | 5
    
    现在我们要编辑顺序为
    2
    的类别,并将其更改为
    4
    。我们要做的是将顺序为
    3
    4
    的类别按一的顺序向下排列:

    Category_Id | Category_Name | CategoryOrder
    1           | name_1        | 1
    2           | name_2        | 2
    3           | name_3        | 2
    4           | name_4        | 3
    5           | name_5        | 5
    
    最后更新所需类别,并将其顺序更新为
    4

    Category_Id | Category_Name | CategoryOrder
    1           | name_1        | 1
    3           | name_3        | 2
    4           | name_4        | 3
    2           | name_2        | 4
    5           | name_5        | 5
    
    现在清楚了吗?

    现在,如果我们想将订单
    5
    的类别更改为第一个,该怎么办?更新所有具有顺序>=
    1
    5
    <的类别,并将顺序设置为
    +1

    Category_Id | Category_Name | CategoryOrder
    1           | name_1        | 2
    3           | name_3        | 3
    4           | name_4        | 4
    2           | name_2        | 5
    5           | name_5        | 5
    
    最后更新所需的类别:

    Category_Id | Category_Name | CategoryOrder
    5           | name_5        | 1
    1           | name_1        | 2
    3           | name_3        | 3
    4           | name_4        | 4
    2           | name_2        | 5
    

    (注意类别是按顺序和id排序的)

    使用
    DML
    语句…你是说像使用UPDATE语句之类的吗?我的问题实际上不是要使用的语句,而是当使用
    DML
    语句输入一个新类别时,如何更改所有行的CategoryOrder列的数值……你是说像使用UPDATE语句之类的吗?我的问题实际上不是要使用的语句,而是当输入一个新类别时,如何更改所有行的CategoryOrder列的数值,该类别的顺序与已存在的类别的顺序类似,让我先试一试。如果而且只有他将新插入的类别的顺序设置为
    1
    ,这就足够了。如果他想插入一个新的类别,其顺序设置为
    3
    ,同时还有5个其他类别,那么您的查询将中断顺序…我没有提到其他部分。我不会只是插入一个类别来取代顶级的类别。我也希望它比目前订单号3或4的要早。@Afam然后检查我的答案,它解决了所有的问题。。。插入和更新…这看起来更像,让我先试试。如果并且只有他将新插入的类别的顺序设置为
    1
    ,这就足够了。如果他想插入一个新的ca