如何仅使用一个查询修改表中卡的位置?

时间:2015-05-21 21:34:23

标签: mysql math

说我在我的数据库中位置1(" foo&#)中有三张牌("第一","第二","第三") 34;),2(" bar")和3(" fubar")。然后我想将fubar移到前面。然后他们将按顺序1(" fubar"),2(" foo"),3(" bar")。

现在每张卡都属于一个列表,每个列表的每张卡都在这个数据库中。这意味着只有属于同一列表的牌需要更新其位置。

在单个查询中执行此操作的最佳方式是什么?

1 个答案:

答案 0 :(得分:1)

如果存在涉及“位置”的唯一约束,则在单个查询中很难(如果不是不可能),但如果没有...

UPDATE theTable 
SET position = IF(otherField='fubar'
                  , [new_position]
                  , IF([new_position] < [old_position]
                       , position + 1
                       , position - 1
                      )
                 ) 
WHERE [condition indicating list] 
      AND (
            ([new_position] < [old_position] 
             AND position BETWEEN [new_position] AND [old_position]
            )
           OR 
            ([new_position] > [old_position] 
             AND position BETWEEN [old_position] AND [new_position]
            )
          ) 
;

如果存在唯一约束,您通常可以通过执行两个查询来绕过它;一个将它们发送到“远离”范围,另一个(相应调整)将它们带回新的位置。

编辑:这仅适用于将'fubar'移动到较低位置;如果向上移动,则需要<=position - 1

Edit2:哦,嗯,实际上这只能从“自上而下”开始。您需要知道'fubar'的原始位置,以防止它们进一步向后移动后留下间隙。

更新:使用已知的“old_position”,我们可以使用相同的查询向前或向后移动。