我有这样的行:
+----+------+-------+
| id | name | order |
+----+------+-------+
| 1 | foo | 2 |
| 2 | bar | 4 |
| 3 | jam | 1 |
| 4 | ban | 3 |
+----+------+-------+
假设,如果我要删除行3
,我们就会这样:
+----+------+-------+
| id | name | order |
+----+------+-------+
| 1 | foo | 2 |
| 2 | bar | 4 |
| 4 | ban | 3 |
+----+------+-------+
我想重置表格中的顺序,因此它变为:
+----+------+-------+
| id | name | order |
+----+------+-------+
| 1 | foo | 1 |
| 2 | bar | 3 |
| 4 | ban | 2 |
+----+------+-------+
即。从1开始逐步上升,同时不改变"顺序"。
我该怎么做?
答案 0 :(得分:1)
考虑到order
列是唯一的,您可以将用户变量与更新连接一起使用,如下所示:
update t t1
join (
select id,
@rn := @rn + 1 rn
from (
select *
from t
order by `order`
) t
cross join (
select @rn := 0
) t2
) t2 on t1.id = t2.id
set t1.`order` = t2.rn;
答案 1 :(得分:1)
就像GurV的回答一样,但更简单:
SET @rn := 0;
UPDATE MyTable
SET `order` = (@rn:=@rn+1)
ORDER BY `order`;
说明:将会话变量@rn初始化为零。按order
按顺序为每一行运行更新,并设置order
列(顺便说一句,我建议选择与关键字不同的列名)。
您为该列设置的值是一个表达式,它使用变量赋值语法,因此对于每一行,它会增加变量。