これを試して:
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
が対応する順序付きと一致するようにしnumber
ます。
最初のINNER JOIN
副選択は次のようになります。
id | id_rank
---------------
2 | 1
3 | 2
6 | 3
7 | 4
10 | 5
11 | 6
12 | 7
15 | 8
次に、2番目のINNER JOIN
サブセレクトは次のようになります。
number | number_rank
---------------
534 | 5
421 | 4
2038 | 7
41 | 2
5383 | 8
5 | 1
933 | 6
43 | 3
id_rank
次に、2 つの副選択を=で結合するnumber_rank
と、2 つのフィールドの昇順が並べられます。それができたら、更新は、テーブルの番号 = 2 番目に結合されたテーブルの番号を設定するだけの簡単な問題になります。