如何在MySql中使用条件更新同一行?

时间:2019-05-18 07:12:46

标签: mysql

这里的数据

KeyID |队列|支付
65的1的0 60的2 2的0
58的3 3的1 57 4 4 1 1
55 5 5 0
54 6 6 0 0
53 7 7 1 1
50颗8颗1

如果像这样的数据,我需要一个MySql查询来更新它,使其像下面的数据表那样仅更新Queue列。

KeyID |队列|支付
65的0的0
60的0 0的
58的1 1的
57的2 2的1
55的0 0的
54 0 0 0 0
53的3 3的1
50个4 4个1

我已经尝试过

更新tabl1     设置Queue =支付= 0时的情况,然后Queue = Queue-1否则Queue

但是队列编号看起来不是这样。

请提出建议。 预先谢谢你

1 个答案:

答案 0 :(得分:0)

我们可以尝试加入计算顺序的子查询:

UPDATE yourTable k1
INNER JOIN
(
    SELECT KeyID, rn
    FROM
    (
        SELECT t1.KeyID,
            (SELECT SUM(t2.Pay = 1) FROM yourTable t2
             WHERE t2.KeyID >= t1.KeyID) rn
        FROM yourTable t1
    ) t
) k2
    ON k1.KeyID = k2.KeyID
SET
    Queue = CASE WHEN Pay = 0 THEN 0 ELSE k2.rn END;

要查看以上逻辑的工作方式,以下是中间联接表的外观:

KeyID | Queue | Pay | rn
65    | 1     | 0   | 0
60    | 2     | 0   | 0
58    | 3     | 1   | 1
57    | 4     | 1   | 2
55    | 5     | 0   | 2
54    | 6     | 0   | 2
53    | 7     | 1   | 3
50    | 8     | 1   | 4

也就是说,最里面的相关子查询通过计算Pay为1的次数来生成队列序列。

请注意,如果您使用的是MySQL 8+,则可以使用解析函数进行更简单的查询:

UPDATE yourTable
SET Queue = CASE WHEN Pay = 0
                 THEN 0
                 ELSE SUM(Pay = 1) OVER (ORDER BY KeyID DESC) END;