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

时间:2013-04-24 15:20:29

标签: php mysql sorting

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

Category_Id | Category_Name | CategoryOrder

我有一个PHP脚本,它为数据库添加了一个新类别,它包括选择类别显示的顺序。因此,例如,如果我在数据库中存储了5个类别,并且我想添加一个新类别并使其成为CategoryOrder列中的第一个类别,则意味着其他类别的CategoryOrder将不得不改变。

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

2 个答案:

答案 0 :(得分:1)

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

  1. 插入新值(更简单的一个):
    • 更新CategoryOrder大于或等于新插入的类别的所有类别: UPDATE Categories SET CategoryOrder = CategoryOrder + 1 WHERE CategoryOrder >= $newCategory['order'];
    • 插入新类别
  2. 更新现有类别:
    • 检查新订单是否大于或小于(如果相同则无需执行任何操作......)
    • 如果它更大,请更新CategoryOrder大于旧订单且小于新订单并减去1的所有类别: UPDATE Categories SET CategoryOrder = CategoryOrder - 1 WHERE CategoryOrder > $category['old_order'] AND CategoryOrder <= $category['new_order']; - 由此填补空白
    • 如果它更小,那么它与更大的时候类似,但为那些有CategoryOrder >= new_orderCategoryOrder < new_order
    • 的类别添加1
  3. 这应该是它。

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

    假设我们有这些条目:

    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。我们要做的是让订单34的类别减少一个:

    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更改为第一个类别,该怎么办?更新包含&gt; = 15的所有类别&lt;并将订单设置为+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排序的类别)

答案 1 :(得分:0)

尝试首先增加CategoryOrder

update categorytable set CategoryOrder = CategoryOrder + 1

然后使用CategoryOrder = 1

插入新记录