2

我有一个表,其中有一个字段sort_id。在该字段中,有从 1 到 n 的数字,用于定义数据集的顺序。现在我想删除一些元素,然后我想重新排序表格。因此,我需要一个查询来“找到”差距并sort_id根据修改更改字段。

当然,我可以这样做:

SELECT sort_id FROM table WHERE id = 5

然后保存 sort_id,然后:

DELETE FROM table WHERE id = 5
UPDATE table SET sort_id = sort_id - 1 WHERE sort_id > {id from above}

但我想一步完成重新排序过程。

4

3 回答 3

3

Mladen 和 Arvo 有很好的想法,但不幸的是在 MySQL 中你不能SELECTUPDATE同一张表在同一个语句中(即使在子查询中)。这是 MySQL 的一个已知限制。

这是一个使用 MySQL 用户变量的解决方案:

SET @i := 0;
UPDATE mytable
SET sort_id = (@i := @i + 1)
ORDER BY sort_id;

对于它的价值,无论如何我都不会打扰这样做。如果您sort_id仅用于排序而不是作为一种“行号”,那么在您删除 where 的行后,这些行仍按排序顺序排列id=6。这些值不一定必须是连续的才能进行排序。

于 2008-11-14T18:29:59.647 回答
0

对于 sql server 2005:这是获得新序列的方式:

SELECT row_number() over(order by sort_id) as RN
FROM table

更新表格意味着您应该将该选择加入您的更新:

update t1
set sort_id = t2.RN
FROM table t1 
     join (SELECT row_number() over(order by sort_id) as RN FROM table) t2 
        on t1.UniqueId = t2.UniqueId
于 2008-11-14T16:25:17.823 回答
0

我不知道 MySQL 的语法变化,也无法实时测试查询,但类似 ​​next 的内容至少应该给你一个想法:

update table t1
set sort_id = (select count * from table t2 where t2.sort_id <= t1.sort_id)
于 2008-11-14T17:50:04.813 回答