我将从我的排序脚本返回值,该脚本在更改的开头和结尾提供元素的位置。所以让我们说第四名是第一名。知道我只需要在原来的第1,第2和第3位置加1来保留订单。
现在,更新数据库的最佳方法是什么?它是为每个需要更改的ID在循环中运行查询吗?这是4个更新查询,看起来效率低下?还有另一种方式吗?
答案 0 :(得分:5)
您可以使用单个查询更新表格中行的位置值,无论您是向上还是向下移动位置:
UPDATE tbl
SET pos = CASE WHEN pos = [oldpos] THEN
[newpos]
WHEN [newpos] < [oldpos] AND pos < [oldpos] THEN
pos + 1
WHEN [newpos] > [oldpos] AND pos > [oldpos] THEN
pos - 1
END
WHERE pos BETWEEN LEAST([newpos], [oldpos]) AND GREATEST([newpos], [oldpos])
pos
是您的职位空缺。
只需将行的当前位置传递为[oldpos]
,将该行的新位置传递给[newpos]
,查询就会对您有用。
实施例。如果你要将一行从第3位改为第10位:
UPDATE tbl
SET pos = CASE WHEN pos = 3 THEN
10
WHEN 10 < 3 AND pos < 3 THEN
pos + 1
WHEN 10 > 3 AND pos > 3 THEN
pos - 1
END
WHERE pos BETWEEN LEAST(3, 10) AND GREATEST(3, 10)
答案 1 :(得分:3)
我做了类似于我认为你想做的事情。我有一个表,其中每一行代表一个特定的UI元素,将在网格中的页面上进行布局。用户能够更改UI元素的顺序,我会将该数字存储在表中,以便默认情况下它会以该顺序出现。
为此,如果我没记错,我使用了两个查询:
UPDATE table SET position = 0 WHERE position = 4;
UPDATE table SET position = position+1 WHERE position < 4;
第一个查询将特定的一个设置为最小的数字,第二个查询将原始值下的所有行增加1(包括您刚刚设置为0的那个,使其为1)。
答案 2 :(得分:1)
在关系数据库中,基础表没有固有的顺序。所以,我假设你想改变输出的顺序。我建议以下查询:
select t.*
from t join
newsort
on t.id = newsort.id
order by newsort.newid