4

我将从我的排序脚本中返回值,该脚本提供了元素在更改开始和结束时的位置。因此,假设第 4 位排在第 1 位。知道我只需要在原来的第 1、2、3 位加 1 就可以保留顺序。

现在,更新数据库的最佳方式是什么?是否为每个需要更改的 id 循环运行查询?那是 4 个更新查询,这似乎效率低下?还有其他方法吗?

4

3 回答 3

8

您可以使用单个查询更新表中行的位置值,无论您是向上还是向下移动位置:

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)
于 2012-08-28T19:09:24.307 回答
3

我做了一些类似于我认为你正在尝试做的事情。我有一个表格,其中每一行代表一个特定的 UI 元素,以网格的形式布置在页面上。用户能够更改 UI 元素的顺序,我会将该数字存储在表中,以便默认情况下按该顺序出现。

为此,如果我没记错的话,我使用了两个查询:

UPDATE table SET position = 0 WHERE position = 4;
UPDATE table SET position = position+1 WHERE position < 4;

第一个查询将该特定的行设置为最小数字,第二个查询将原始值下的所有行增加 1(包括您刚刚设置为 0 的行,使其为 1)。

于 2012-08-28T17:59:05.827 回答
1

在关系数据库中,基础表没有固有顺序。所以,我假设你想改变输出的顺序。我建议以下查询:

select t.*
from t join
     newsort
     on t.id = newsort.id
order by newsort.newid
于 2012-08-28T17:59:44.643 回答