1

我有这样的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 不会是连续的

4

3 回答 3

4
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
于 2012-06-24T07:26:46.957 回答
0
update table set number=id where 1
于 2012-06-24T06:57:02.503 回答
0

试试这个:

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

解释:

它基本上分别取每个字段的升序并加入等级,以便idorder 与相应的 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,您会将两个字段的升序排列起来。一旦你有了它,更新就变成了一个简单的问题,即设置表的编号 = 第二个连接表的编号。

于 2012-06-24T08:13:46.060 回答