我们说我有这张桌子:
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
答案 0 :(得分:3)
我并不完全清楚您打算如何重新排序操作。这是你的想法吗?
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