更改mysql数据库中项目顺序的最有效方法

时间:2012-08-28 17:56:46

标签: mysql

我将从我的排序脚本返回值,该脚本在更改的开头和结尾提供元素的位置。所以让我们说第四名是第一名。知道我只需要在原来的第1,第2和第3位置加1来保留订单。

现在,更新数据库的最佳方法是什么?它是为每个需要更改的ID在循环中运行查询吗?这是4个更新查询,看起来效率低下?还有另一种方式吗?

3 个答案:

答案 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