0

在一个简单的MySQL 更新语法上挣扎了几个小时。Tablevotesum列是vote1+vote2列的总和。如果有几个votesum值彼此相等(如下例所示的 20 和 20),我需要将votesum具有较高vote1值的​​行的值增加 1。

id|vote1|vote2|votesum
 1|10   |10   |20
 2|5    |15   |20
 3|2    |2    |4
 4|1    |1    |2

我正在寻找的MySQL 更新语法votesum应该检查最大数量是单独的,还是有更多相等的 votesum 值。如果有两个(或更多),那么我需要增加votesum.

所以更新表后应该如下所示:

id|vote1|vote2|votesum
 1|10   |10   |21
 2|5    |15   |20
 3|2    |2    |4
 4|1    |1    |2
 5|0    |2    |2

请记住,最高值votesum是我需要更新的值。在上面的示例中,id=1andid=2不能相等,但id=4andid=5可以相等,因为我不注意那些votesum不是最高值的值。

4

2 回答 2

0

I think this will do what you want:

update table t1 join table t2 on t1.votesum = t2.votesum and t1.vote1 > t2.vote2 set t1.votesum = t1.votesum + 1 order by t1.votesum limit 1

于 2013-09-12T15:02:11.280 回答
0

以下查询使用变量来计算增量值:

    select t.*,
           @inc := if(@votesum = votesum, @inc + 1 , 0) as inc,
           @votesum := votesum
    from t cross join
         (select @votesum := -1, @inc := 0) const
    order by votesum desc, vote1 asc;

这可以在update语句中使用,使用join

update t join
       (select t.*,
               @inc := if(@votesum = votesum, @inc + 1 , 0) as inc,
               @votesum := votesum
        from t cross join
             (select @votesum := -1, @inc := 0) const
        order by votesum desc, vote1 asc
       ) inc
       on t.id = inc.id and inc.inc > 0
    update t.votesum = t.votesum + inc.inc;
于 2013-09-12T15:06:36.067 回答