如何在前几行的总和达到阈值后更新以下行?MySQL

如何在前几行的总和达到阈值后更新以下行?MySQL,mysql,sql,stored-procedures,sql-update,Mysql,Sql,Stored Procedures,Sql Update,我想在前几行的总和达到定义的阈值后更新以下几行。我正在使用MySQL,并试图想出一种仅使用SQL解决此问题的方法 这里有一个例子。阈值为100。迭代行,当前几行的总和大于等于100时,将以下行设置为选中 Before the operation: | id | amount | checked | | 1 | 50 | false | | 2 | 50 | false | | 3 | 20 | false | | 4 | 30 | false

我想在前几行的总和达到定义的阈值后更新以下几行。我正在使用MySQL,并试图想出一种仅使用SQL解决此问题的方法

这里有一个例子。阈值为100。迭代行,当前几行的总和大于等于100时,将以下行设置为选中

Before the operation: | id | amount | checked | | 1 | 50 | false | | 2 | 50 | false | | 3 | 20 | false | | 4 | 30 | false | After the operation: | id | amount | checked | | 1 | 50 | false | | 2 | 50 | false | <- threshold reached (50 + 50 >= 100) | 3 | 20 | true* | | 4 | 30 | true* | 手术前: |id |金额|已检查| |1 | 50 |假| |2 | 50 |假| |3 | 20 |错误| |4 | 30 |错误| 手术后: |id |金额|已检查| |1 | 50 |假| |2 | 50 |假|=100) |3 | 20 |正确*| |4 | 30 |正确*|
只需一个SQL查询就可以做到这一点吗?我需要存储过程吗?我如何使用这两种解决方案实现它?

您可以通过计算累计金额并使用
update
join
来实现:

update table t join
       (select t.*, (select sum(amount) from table t2 where t2.id <= t.id) as cum
        from table t
       ) tcum
       on tcum.id = t.id and tcum.cum >= 100
    set checked = true;

像这样的?还没有测试,所以可能需要调整一两次,但这应该可以满足您的需要

UPDATE table t, 
    (SELECT
      @a := @a + amount AS cumulative_sum
    FROM table
    JOIN (SELECT @a := 0) as whatever 
) temp
  SET t.checked = true WHERE temp.cumulative_sum >= 100 ;

这在sql中是可能的。您可以提供您使用的查询吗?mysql没有基于行的操作。您需要使用存储的过程或客户端代码来执行这些操作。用户定义的变量也可以使用,尽管这是使用通常不赞成的相关子查询。。。根据数据库的大小,这个过程可能需要几个小时。。。因为这是一次性的事情,没关系,但我通常试着避开他们。是的!它在测试台上确实起作用,但在真正的测试台上却要花很长时间。@JohnRuddell。我曾经对相关子查询有过这样的感觉。现在我更好地理解了它们在哪里有用,偶尔在哪里需要它们。。。但我只在知道我有多少数据时才使用它们。它们在某些情况下非常有用。。当更新一个表时,它是一件一次性的事情,所以它不像是世界末日。。但我想最好能指出这一点,因为OP可能不知道这一点。TBH我一直在看你的答案,因为它们非常简洁和有用:)我可能是你的跟踪者,也可能不是:P@GordonLinoff我还没有真正理解交叉连接相对于另一个连接的好处。你能解释一下吗?
UPDATE table t, 
    (SELECT
      @a := @a + amount AS cumulative_sum
    FROM table
    JOIN (SELECT @a := 0) as whatever 
) temp
  SET t.checked = true WHERE temp.cumulative_sum >= 100 ;