我有这样的表:
===============
| 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+行。
编辑:抱歉,我不清楚。我正在尝试更新数据库中的值。
答案 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;
简单的方法,为我工作。简单的方法。