SQL:如何更改行顺序位置

Cor*_*ell 5 mysql sql mariadb

假设我有这张桌子:

ID     Name    position
11     Kate        1
12     Frank       2
13     Anna        3
14     Peter       4
15     James       5
16     Michael     6
Run Code Online (Sandbox Code Playgroud)

给出当前 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 {
    …
}
Run Code Online (Sandbox Code Playgroud)

这样做的问题之一是,如果当前位置为 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
Run Code Online (Sandbox Code Playgroud)

sha*_*t00 6

我不完全清楚您打算如何进行重新排序操作。这是你想到的吗?

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
Run Code Online (Sandbox Code Playgroud)