给定一个包含以下列的表:( x列用于演示哪些行正在更改)
x,myval
a, 2
b, 3
b, 5
d, 8
e, 9
f, 10
...
我想要在表格上运行批量更新的最有效方法,并根据以下公式更改myval
列的值:
myval = (row#)*2 in ORDER myval ASC
这样在UPDATE操作之后,表格看起来像这样
x,myval
a, 2
b, 4
b, 6
d, 8
e, 10
f, 12
...
我认为有一种方法可以使用某种复合UPDATE / SELECT语句和派生的变量。这是通过SELECT显示值的方法:
SELECT (@rownum:=@rownum+1)*2 'newval',p.*
FROM table p,(select @rownum:=0) r
WHERE xxx
ORDER BY myval ASC
newval, x,myval
2, a, 2
4, b, 3
6, b, 5
8, d, 8
10, e, 9
12, f, 10
那么有人可以向我展示适当的UPDATE语句,可以一次性或其他方式执行此操作吗?
UPDATE ...列x是一个任意列 - 它可以包含任何数据。我包括它,以便您可以看到哪些行被更改。
答案 0 :(得分:1)
试试这个
Update thisTable set myVal =
2 * (Select Count(*)
From Table
Where x <= thisTable.x)
答案 1 :(得分:1)
最有效的方法可能是使用update
/ join
:
update table p join
(SELECT (@rownum := @rownum + 2 as rn, p.*
FROM table p cross join
(select @rownum : =0) const
WHERE xxx
ORDER BY myval ASC
) toupdate
on p.x = toupdate.x
set p.myval = toupdate.rn;
根据您对其他答案的评论,我并非100%确定连接条件是否正确。
答案 2 :(得分:0)
以下是我在PHP中完成此操作的方法。
假设x表示表中的唯一/主键列:
$q="select x from `table` order by myval ASC";
$count=0;
$r=mysql_query($q) or die ("Error during: ".$q. " " .mysql_error());
while ($rec=mysql_fetch_array($r)) {
$count++;
$sortval=$count*2;
$q2="update `table` set myval='$sortval' where x='".$rec['x']."' LIMIT 1";
$r2=mysql_query($q2) or die ("Error during: ".$q2. " " .mysql_error());
}
似乎PHP中的嵌套循环也可以。我很好奇是否可以在更简单的SQL语句中完成,但最后我用PHP和MySQL编写了它。