【问题标题】:MySQL: Get minimal set of entries where sum(value) is bigger then given numberMySQL:获取总和(值)大于给定数字的最小条目集
【发布时间】:2016-01-30 21:50:12
【问题描述】:

我遇到了一个新的/特殊的问题,我无法找到一个好的解决方案,也许有人有想法?

表格如下:

|  id | value | 
---------------
|   … |     … |
|  11 |   500 |
|  12 |   300 |
|  13 |   200 |
|  14 |   400 |
|  15 |   300 |
---------------

现在我需要选择(然后删除/更新)这些条目,直到达到我的给定值 (1250),所以在“魔法”之后我需要如下表:

|  id | value |
---------------
|   … |     … |
|  11 |   450 |
---------------

有没有什么好的可能性(性能很重要)? (那个select查询,其他两个应该会容易多了)

我找到了一些带有子选择(无限制...)和“where sum()

【问题讨论】:

    标签: mysql select sum set


    【解决方案1】:
    DROP TABLE IF EXISTS my_table;
    
    CREATE TABLE my_table
    (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
    ,value INT NOT NULL
    );
    
    INSERT INTO my_table VALUES
    (10,700),
    (11,500),
    (12,300),
    (13,200),
    (14,400),
    (15,300);
    

    为简单起见,以下查询假定 id 是连续的,但它可以很容易地扩展到它们不连续的情况。

    SELECT a.id
         , LEAST(a.value,a.value-i) value 
      FROM my_table a 
      JOIN 
         ( SELECT *
                , @i:=@i-value i 
             FROM my_table
                , ( SELECT @i:=1250) vars 
            ORDER 
               BY id DESC
         ) b
        ON b.id = a.id + 1
       AND a.value - i >= 0;
    
    +----+-------+
    | id | value |
    +----+-------+
    | 10 |   700 |
    | 11 |   450 |
    +----+-------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-07
      • 2016-05-27
      • 1970-01-01
      • 2017-01-10
      • 2020-11-22
      • 2021-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多