说我在我的数据库中位置1(" foo&#)中有三张牌("第一","第二","第三") 34;),2(" bar")和3(" fubar")。然后我想将fubar移到前面。然后他们将按顺序1(" fubar"),2(" foo"),3(" bar")。
现在每张卡都属于一个列表,每个列表的每张卡都在这个数据库中。这意味着只有属于同一列表的牌需要更新其位置。
在单个查询中执行此操作的最佳方式是什么?
答案 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”,我们可以使用相同的查询向前或向后移动。