我有这样的MYSQL数据
id | number
1 | 3
4 | 4
7 | 7
10 | 5
11 | 6
我有这样的数据库,以及如何更新number
它以增量排序?
这意味着结果将是这样的
id | number
1 | 1
4 | 2
7 | 3
10 | 4
11 | 5
我更新了这个问题,所以不会有混淆id
,因为 id 不会是连续的
我有这样的MYSQL数据
id | number
1 | 3
4 | 4
7 | 7
10 | 5
11 | 6
我有这样的数据库,以及如何更新number
它以增量排序?
这意味着结果将是这样的
id | number
1 | 1
4 | 2
7 | 3
10 | 4
11 | 5
我更新了这个问题,所以不会有混淆id
,因为 id 不会是连续的
set @val = 0;
update table_name set number = (@val:=@val+1);
即使 table 是,这也会起作用:
id | number
1 | 3
4 | 4
7 | NULL
10 | 5
11 | NULL
变成这样:
id | number
1 | 1
4 | 2
7 | 3
10 | 4
11 | 5
update table set number=id where 1
试试这个:
SET @idrank = 0;
SET @numrank = 0;
UPDATE
tbl a
INNER JOIN
(
SELECT id, @idrank:=@idrank+1 AS id_rank
FROM tbl
ORDER BY id
) b ON a.id = b.id
INNER JOIN
(
SELECT number, @numrank:=@numrank+1 AS number_rank
FROM tbl
ORDER BY number
) c ON b.id_rank = c.number_rank
SET
a.number = c.number;
这将解释该number
领域的差距和违规行为以及重复。假设整个数据集类似于:
id | number
---------------
2 | 534
3 | 421
6 | 2038
7 | 41
10 | 5383
11 | 5
12 | 933
15 | 43
更新后的结果表集将是:
id | number
---------------
2 | 5
3 | 41
6 | 43
7 | 421
10 | 534
11 | 933
12 | 2038
15 | 5383
它基本上分别取每个字段的升序并加入等级,以便id
order 与相应的 ordered 匹配number
。
第一INNER JOIN
个子选择将如下所示:
id | id_rank
---------------
2 | 1
3 | 2
6 | 3
7 | 4
10 | 5
11 | 6
12 | 7
15 | 8
然后第二INNER JOIN
个子选择将像这样:
number | number_rank
---------------
534 | 5
421 | 4
2038 | 7
41 | 2
5383 | 8
5 | 1
933 | 6
43 | 3
id_rank
然后,当您在=上加入两个子选择时number_rank
,您会将两个字段的升序排列起来。一旦你有了它,更新就变成了一个简单的问题,即设置表的编号 = 第二个连接表的编号。