mysql - 如何跨多个列进行级联递减

标签 mysql

我有 N 列:A、B、C、.. N 每列都是小数 (8,2)。 我想编写一个存储过程,它接受一个行 ID 和一个小数点 (8,2) X。

我希望它递减 A 直到 A 达到零或直到它减少 X。如果 A 达到零并且 X 大于 A 那么我想将 B 递减 X - A 的原始值等等。

例子:

select * from foo_table where id = 0;

| id| A | B | C |..
+---+---+---+---+
| 0 | 5 | 3 | 2 |

call my_stored_proc(0,9);
select * from foo_table where id = 0;

| id| A | B | C |..
+---+---+---+---+
| 0 | 0 | 0 | 1 |

执行此操作的推荐和高效方法是什么?

最佳答案

鉴于您的示例数据,此查询完成了这项工作:

UPDATE t
JOIN (

    SELECT
    t.id,
    GREATEST(A - @a, 0) A,
    @a := GREATEST(@a - A, 0),
    GREATEST(B - @a, 0) B,
    @a := GREATEST(@a - B, 0),
    GREATEST(C - @a, 0) C,
    @a := GREATEST(@a - C, 0)
    FROM
    t
    , (SELECT @a := 9) var_init_subquery
    WHERE id = 0
    ORDER BY id

) sq ON t.id = sq.id
SET t.A = sq.A
, t.B = sq.B
, t.C = sq.C;
  • 看到它在 sqlfiddle 中实时运行
  • here您可以阅读有关查询中变量的更多信息

关于mysql - 如何跨多个列进行级联递减,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34391394/

相关文章:

php - Laravel 查询错误 - 调用未定义的方法 Illuminate\Database\Query\Builder::query()

mysql: 恰好语句 "Start binlog_dump to slave_server"登录到master错误日志

php - 唯一索引中 url 的 md5 哈希值

php - Mysql查询无法根据条件检索数据

php - 如何在PHP上创建目录路径

mysql - 在 MySQL SUM 时间戳差异中实现 IF

mysql - sql左连接选择左表中的所有记录,即使右表中没有记录

mysql - 获取子表中的记录数

php - 在网站上显示一些统计信息的最佳方式?

MySQL计算特定日期时间