2011-09-27 88 views
1

我有一个查询来减去存储在数据库上的值。MYSQL:查询更新增量值并存储返回值

UPDATE tablename SET 
available = IF(available > 0, available - " . $var . ", 0) , 
purchases = purchases + 1 
WHERE condition 

是更多钞票拿到场可用的新的价值,而不作出新的选择,然后惩罚的表现?

回答

1

我还没有测试此代码,但我 87587% 确保它工作。

更新语句不返回一个结果,但是你可以设置一个变量@var并从该选择。

UPDATE tablename 
SET 
    available = @fastpeek:= IF(available > 0, available - " . $var . ", 0) 
    ,purchases = purchases + 1 
WHERE condition 
LIMIT 1; 

SELECT @fastpeek as available_in_update; 

这将打破,如果你更新但超过1行:更新超过1行时,@fastpeek将只显示最后一次更新。因此,限制1.
你仍然需要额外的选择,但它不需要查询数据库,它只会从内存中检索@var。

+0

谢谢Johan!我不得不对你的精彩建议做一些调整。最后,我使用的查询是:'UPDATE表名 SET 可用= @ fastpeek:= IF(可> 0,...' – Crazystress

2

你可以使用MySQL用户定义函数:

CREATE FUNCTION registerPurchase(idParam INT, qty INT) 
RETURNS INT 
BEGIN 
    DECLARE avail INT, purc INT, 

    SELECT available, purchases INTO avail, purc FROM tablename WHERE id = idParam; 

    SET avail = IF(avail > 0, avail - qty, 0); 
    SET purc = purc - 1; 

    UPDATE tablename SET 
    available = avail, 
    purchases = purc 
    WHERE id = idParam; 

    RETURN avail; 
END 

或者类似的东西。例如,您可以使用SELECT registerPurchase(1234, 2);来调用它。这可以与@ Johan的解决方案相结合,以实现更大的正义。

编辑:

这里有一个链接:http://dev.mysql.com/doc/refman/5.6/en/create-procedure.html

+0

+1,因为你保存到数据库的额外调用,甚至会更快地执行, – Johan