我这样做了几次。我现在找不到任何代码,所以我只发布一个算法(其中可能包含一些伪代码):
- 插入一个新值(更简单的一个):
- 更新所有与
CategoryOrder
新插入的类别更大或相同的类别:
UPDATE Categories SET CategoryOrder = CategoryOrder + 1 WHERE CategoryOrder >= $newCategory['order'];
- 插入您的新类别
- 更新现有类别:
- 检查新订单是否比原来更大或更小(如果相同则无需执行任何操作...)
- 如果它更大,则更新所有
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 >=1
和5
< 的类别并将 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 排序的类别)