3

私はこのようなテーブルを持っています:

===============
| rank | name |
===============
|    3 | john |
|    6 |  bob |
|   10 | alex |
|   11 | brad |
|   12 | matt |
|   34 | luke |
|  145 |  ben |
===============

(この表は一例です。実際には、私の表は最大 5000 行のデータで構成されています)。

ランク値を 1 から順に並べ替えて、次のようになるクエリはありますか。

===============
| rank | name |
===============
|    1 | john |
|    2 |  bob |
|    3 | alex |
|    4 | brad |
|    5 | matt |
|    6 | luke |
|    7 |  ben |
===============

私のテーブルには5000以上の行があるため、各行に対して1つのクエリではなく、1つまたは2つのクエリでこれを行うことが望ましいでしょう。

編集:申し訳ありませんが明確ではありませんでした。データベースの値を更新しようとしています。

4

4 に答える 4

4

これは少し大雑把ですが、ピンチで機能します。

念のため、最初にテーブルを正しく注文してください

ALTER TABLE tablename ORDER BY rank

次に、列をドロップします

ALTER TABLE tablename DROP rank

次に、自動インクリメントで再度追加します

ALTER TABLE tablename ADD COLUMN rank INT NOT NULL AUTO_INCREMENT FIRST

自動インクリメントは順番に番号を付けます。さらに、各行をループする必要はありません。

于 2012-06-11T21:12:30.777 に答える
0

厳密な MySQL ソリューションに代わる方法は、スクリプト言語を使用して行をループすることです。大きなテーブルがある場合は良い考えではありませんが、これが 1 回限りの修正であれば許容できる可能性があります。

PHPで

$db = mysql_connect('localhost', 'user', 'password');
mysql_select_db('database', $db);

$result = mysql_query("SELECT rank
                        FROM myTable
                        ORDER BY rank");

$i = 1;

while ($row = mysql_fetch_assoc($result)) {

    mysql_query("UPDATE myTable
                SET rank = " . $i++ . "
                WHERE rank = " . $row['rank']);
}

rankこれは、が一意で、順番にトラバースする場合にのみ機能することに注意してください。

于 2012-06-13T17:42:23.703 に答える
0
set @a:=(select max(id) from mytable)+1;
update mytable set id=(@a:=@a+1)
order by id;
set @a := 0;
update mytable set id=(@a:=@a+1)
order by id;

簡単な方法、私のために働いてください。簡単な方法。

于 2016-10-03T18:59:46.847 に答える
0

この問題に対して私が思いついた解決策は次のとおりです。

1.キーなしで一時テーブルを作成する

CREATE TEMPORARY TABLE tempTable (
  id INT(11) NOT NULL
)
COLLATE='latin1_swedish_ci'
ENGINE=MyISAM
ROW_FORMAT=DEFAULT;

2.一時テーブルに元のテーブルのデータをランク順に入力します

INSERT INTO tempTable SELECT id FROM myTable ORDER BY rank;

3. 自動インクリメント ランク列を追加し、すべての行に一意のランクを与え、1 からカウントアップします。

ALTER TABLE tempTable
    ADD COLUMN `rank` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    ADD PRIMARY KEY (`rank`);

4.一時テーブルへの結合で元のテーブルを更新し、元のランクを上書きします

UPDATE myTable 
INNER JOIN tempTable
    ON myTable.id = tempTable.id
SET myTable.rank = tempTable.rank;

5.一時テーブルをドロップする

DROP TABLE tempTable;
于 2012-06-13T17:35:56.933 に答える