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);

テーブルが次の場合でも、これは機能します。

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

これを試して:

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 番目に結合されたテーブルの番号を設定するだけの簡単な問題になります。

于 2012-06-24T08:13:46.060 に答える
0
update table set number=id where 1
于 2012-06-24T06:57:02.503 に答える