MySQL查询重新排序字段值?

时间:2012-06-11 20:55:31

标签: mysql

我有这样的表:

===============
| 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 个答案:

答案 0 :(得分:4)

这有点粗糙,但会在紧要关头工作。

首先正确订购你的桌子

ALTER TABLE tablename ORDER BY rank

然后删除列

ALTER TABLE tablename DROP rank

然后再次添加,自动增量

ALTER TABLE tablename ADD COLUMN rank INT NOT NULL AUTO_INCREMENT FIRST

自动增量将按顺序对它们进行编号,而且您不必遍历每一行。

答案 1 :(得分: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 the temp table

DROP TABLE tempTable;

答案 2 :(得分: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唯一且您按顺序遍历时才有效。

答案 3 :(得分: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;
简单的方法,为我工作。简单的方法。