2011-09-27 100 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