我有一个包含字段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}
但我想一步完成重新排序过程。
答案 0 :(得分:3)
Mladen和Arvo有很好的想法,但遗憾的是在MySQL中你不能SELECT
和UPDATE
同一个语句中的同一个表(即使在子查询中)。这是MySQL的一个已知限制。
这是一个使用MySQL用户变量的解决方案:
SET @i := 0;
UPDATE mytable
SET sort_id = (@i := @i + 1)
ORDER BY sort_id;
对于它的价值,无论如何我都不会这么做。如果您的sort_id
仅用于排序而不是一种“行号”,则在删除id=6
行后,行仍按排序顺序排列。这些值不一定必须连续进行排序。
答案 1 :(得分:0)
for 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
答案 2 :(得分:0)
我不知道MySQL的语法变化,也无法实时测试查询,但接下来的事情应该至少给你一个想法:
update table t1
set sort_id = (select count * from table t2 where t2.sort_id <= t1.sort_id)