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 |
===============

最好在 1 或 2 个查询中执行此操作,而不是每行 1 个查询,因为我的表有 5000 多行。

编辑:对不起,我不清楚。我正在尝试更新数据库中的值。

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

这是我为这个问题提出的解决方案:

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 回答
0

严格的 MySQL 解决方案的替代方法是使用脚本语言循环遍历行。如果您有一张大桌子,这不是一个好主意,但如果这是一次性修复,则可以接受。

在 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 回答