我有一张这样的表
+----+-------+------+
| 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());
}
}
答案 0 :(得分:3)
这是苹果......
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;
答案 1 :(得分:3)
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 |