2016-11-15 104 views
3

比方說,我有這個表:SQL:如何更改行順序位置

ID  Name position 
11  Kate  1 
12  Frank  2 
13  Anna  3 
14  Peter  4 
15  James  5 
16  Michael  6 

給出當前ID和目標位置,我需要拿出重新排序它的有效方式。

我想到了混合一點SQL與我的服務器端語言,例如。 (向上移動弗蘭克):

if (newPosition > oldPosition) { 
    UPDATE people SET position = position - 1 WHERE listId = 1 AND position <= @newPosition AND Name != "Frank"; 
    UPDATE people SET position = @newPos WHERE listId = 1 AND Name="Frank"; 
} else { 
    … 
} 

其中一個問題是,如果當前位置爲0,它將變爲負值。

有關如何重新排序行的任何想法?

編輯:作爲我想要做的一個例子,假設我想將弗蘭克(位置= 2)向下移動到彼得(位置= 4)和詹姆斯(位置= 6)之間,所以理想情況下,表應該看起來像這樣:

ID  Name position 
11  Kate  1 
13  Anna  2 
14  Peter  3 
12  Frank  4 
15  James  5 
16  Michael  6 

回答

2

我不完全清楚你打算如何重新排序操作工作。這是你想到的嗎?

update T 
set position = 
    case  
     when newPosition > oldPosition then 
      case when position = least(oldPosition, newPosition) 
       then newPosition else position - 1 end 
     else /* newPosition < oldPosition */ 
      case when position = greatest(oldPosition, newPosition) 
       then newPosition else position + 1 end 
    end  
where position between 
      least(oldPosition, newPosition) 
    and greatest(oldPosition, newPosition) 
    and oldPosition <> newPosition 
+0

感謝您的回覆。 假設我想在彼得(位置= 4)和詹姆斯(位置= 6)之間移動弗蘭克(位置= 2)。此更新聲明似乎將弗蘭克的立場改變爲4(與詹姆斯相同),並且沒有人在第2位之後。 – Cornwell

+0

@Cornwell你爲'oldPosition'和'newPosition'使用了什麼值? – shawnt00

+0

oldPosition = 2; newPosition = 4 – Cornwell