我正在创建一个论坛应用程序,并且我有一个存储类别的表。这个表有3列:
Category_Id | Category_Name | CategoryOrder
我有一个PHP脚本,添加一个新的类别到数据库,它包括选择在其中类别将显示的顺序。因此,例如,如果我在数据库中存储了5个类别,并且我想添加一个新类别并使其成为CategoryOrder
列中的第一个类别,这意味着其他类别的CategoryOrder
将不得不更改。
如果表中只有一个类别,我只需将其更新为新值并将1
值分配给新类别。但是如果我有5行呢?我如何改变它们,把1
加到它们的当前值?我不知道我写的是否有意义
我这样做过几次。我现在找不到任何代码,所以我只发布一个算法(可能有一些伪代码):
- 插入一个新值(更简单的):
- 更新所有
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'];
- by this You fill the gap - 如果它较小,则与它较大时类似,但在具有
CategoryOrder >= new_order
和CategoryOrder < new_order
的类别中添加1
应该是这样。
EDIT:关于第二种情况(更新)的解释:
假设我们有这些条目:
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
成为第一个呢?更新order>= 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
update categorytable set CategoryOrder = CategoryOrder + 1
然后用CategoryOrder = 1