2013-04-24 26 views
1

我正在创建一个论坛应用程序,并且我有一个存储类别的表。此表有3列:我如何添加一个新的条目到表中,并更改其他条目的排序顺序

Category_Id | Category_Name | CategoryOrder 

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

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

+0

使用'DML'语句... – Kermit 2013-04-24 15:28:43

+0

你的意思是像使用UPDATE语句和东西?我的问题实际上不是关于要使用的语句,而是有关如何更改所有行的CategoryOrder列的数字值,当输入一个已经存在Order的新类别时 – Afam 2013-04-24 15:31:52

回答

0

尝试递增CategoryOrder第一

update categorytable set CategoryOrder = CategoryOrder + 1 

然后插入与CategoryOrder = 1

+0

这看起来更像它,让我先尝试一下。 – Afam 2013-04-24 15:34:30

+0

只要他为新插入的类别设置顺序为'1'就足够了。如果他希望在订单设置为“3”的情况下插入一个新的类别,同时还有5个其他类别,则您的查询将中断订单... – shadyyx 2013-04-24 15:37:48

+0

我没有提到其他部分。我不仅会插入一个类别来取代顶级梯队中的一个。我可能也希望它在目前的订单号3或4之前。 – Afam 2013-04-24 15:45:01

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']; - 这个你填补了国内空白
    • 如果是较小的,做到这一点类似于当它是大,但加1到那些有CategoryOrder >= new_orderCategoryOrder < new_order
  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成为第一个类别?更新所有具有顺序> = 15 <,并设置为+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 

(注意类别被他们的顺序排序和编号)

+0

这看起来更全面,可以解决我所有的问题。虽然我仍然试图了解第二号。 – Afam 2013-04-24 15:56:20

+0

@Afam所以检查编辑,也许我更清楚了... – shadyyx 2013-04-24 16:04:32

+0

我现在完全得到它。让我测试它。 – Afam 2013-04-24 16:07:24

相关问题