UPDATE语句,用于根据公式重新分配数值

时间:2014-04-27 23:38:39

标签: php mysql sql

给定一个包含以下列的表:( 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是一个任意列 - 它可以包含任何数据。我包括它,以便您可以看到哪些行被更改。

3 个答案:

答案 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编写了它。