【问题标题】:remove values from different rows until data exhaustion?从不同的行中删除值直到数据耗尽?
【发布时间】:2014-01-20 14:15:32
【问题描述】:

我有一张这样的桌子

+----+-------+------+
| id | apple | pear |
+----+-------+------+
|  1 |   3   |  10  |
+----+-------+------+
|  2 |   5   |   8  |
+----+-------+------+
|  3 |   4   |   7  |
+----+-------+------+

我必须删除 9 个苹果和 11 个梨。 这样的结果

+----+-------+------+
| id | apple | pear |
+----+-------+------+
|  1 |   0   |   0  |
+----+-------+------+
|  2 |   0   |   7  |
+----+-------+------+
|  3 |   1   |   7  |
+----+-------+------+

有没有办法做到这一点而不必做很多查询?

我做了这样的事情。 不知道有没有更好的办法。

    $eat["apple"]=9; 
    $eat["pear"]=11;
    $id=0;   //I will increment this id during the cycle

    while ($eat["apple"] > 0 && $eat["pear"] > 0) {
        $get_fruit=mysql_query("SELECT id,apple,pear FROM fruits WHERE 
           id>'".$id."' 
   ORDER BY id LIMIT 1") or die (mysql_error());

        if((mysql_num_rows($get_fruit))==0){
           die; 
        } else {

          $fruit = mysql_fetch_assoc($get_fruit);
          $id = $fruit["id"];   

          foreach ($eat as $key => $value) {

             if ($fruit[$key]>$eat[$key]) {
                $fruit[$key]-=$eat[$key];
                $eat[$key]=0;
             } else {
                $eat[$key]-=$fruit[$key];
                $fruit[$key]=0;
             }
      }

    $update=mysql_query("UPDATE fruits SET 
            apple='".$fruit["apple"]."',
            pear='".$fruit["pear"]."' 
            WHERE id='".$id."'LIMIT 1") or die (mysql_error());
}

}

【问题讨论】:

  • 你的苹果不加起来。
  • 更新表 SET apple=SUM(apple)-9;更新表 SET apple=o WHERE id!=1

标签: php mysql rows cycle


【解决方案1】:
CREATE TABLE t
    (`id` int, `apple` int, `pear` int)
;

INSERT INTO t
    (`id`, `apple`, `pear`)
VALUES
    (1, 3, 10),
    (2, 5, 8),
    (3, 4, 7)
;

UPDATE t
INNER JOIN (
  SELECT
  id, apple, pear,
  GREATEST(0, apple - GREATEST(0, @atr)) AS new_apples,
  @atr := @atr - apple,
  GREATEST(0, pear - GREATEST(0, @ptr)) AS new_pears,
  @ptr := @ptr - pear
  FROM t
  , (SELECT @atr := 9, @ptr := 11) variable_initialization_subquery /*@atr = ApplesToRemove...*/
  ORDER BY id
  ) sq ON t.id = sq.id
SET t.apple = sq.new_apples,
t.pear = sq.new_pears;

SELECT * FROM t;

| ID | APPLE | PEAR |
|----|-------|------|
|  1 |     0 |    0 |
|  2 |     0 |    7 |
|  3 |     3 |    7 |

【讨论】:

    【解决方案2】:

    这是苹果……

    SET @apple = 9;
    UPDATE fruits x
      JOIN 
         ( SELECT id
                , apple
                , GREATEST(apple-@apple,0)n,@apple:=@apple-apple 
             FROM fruits 
            ORDER 
               BY id
         ) y
        ON y.id = x.id
       SET x.apple = y.n;
    

    【讨论】:

      猜你喜欢
      • 2016-01-30
      • 2018-11-09
      • 1970-01-01
      • 2012-03-14
      • 2011-03-18
      • 1970-01-01
      • 2014-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多