1

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

Category_Id | Category_Name | CategoryOrder

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

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

4

2 回答 2

2

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

  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_order和的类别加 1CategoryOrder < new_order

这应该是它。

编辑:对第二种情况的解释(更新):

假设我们有这些条目:

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

现在我们要使用 order 编辑 category2并将其更改为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

现在清楚了吗?

现在,如果我们想用 order 更改 category5成为第一个呢?更新所有具有 order >=15< 的类别并将 order 设置为+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 排序的类别)

于 2013-04-24T15:34:36.583 回答
0

尝试先增加 CategoryOrder

update categorytable set CategoryOrder = CategoryOrder + 1

然后插入新记录CategoryOrder = 1

于 2013-04-24T15:29:57.927 回答