我将从我的排序脚本中返回值,该脚本提供了元素在更改开始和结束时的位置。因此,假设第 4 位排在第 1 位。知道我只需要在原来的第 1、2、3 位加 1 就可以保留顺序。
现在,更新数据库的最佳方式是什么?是否为每个需要更改的 id 循环运行查询?那是 4 个更新查询,这似乎效率低下?还有其他方法吗?
我将从我的排序脚本中返回值,该脚本提供了元素在更改开始和结束时的位置。因此,假设第 4 位排在第 1 位。知道我只需要在原来的第 1、2、3 位加 1 就可以保留顺序。
现在,更新数据库的最佳方式是什么?是否为每个需要更改的 id 循环运行查询?那是 4 个更新查询,这似乎效率低下?还有其他方法吗?
您可以使用单个查询更新表中行的位置值,无论您是向上还是向下移动位置:
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)
我做了一些类似于我认为你正在尝试做的事情。我有一个表格,其中每一行代表一个特定的 UI 元素,以网格的形式布置在页面上。用户能够更改 UI 元素的顺序,我会将该数字存储在表中,以便默认情况下按该顺序出现。
为此,如果我没记错的话,我使用了两个查询:
UPDATE table SET position = 0 WHERE position = 4;
UPDATE table SET position = position+1 WHERE position < 4;
第一个查询将该特定的行设置为最小数字,第二个查询将原始值下的所有行增加 1(包括您刚刚设置为 0 的行,使其为 1)。
在关系数据库中,基础表没有固有顺序。所以,我假设你想改变输出的顺序。我建议以下查询:
select t.*
from t join
newsort
on t.id = newsort.id
order by newsort.newid