我有一张这样的桌子
tbl_user
id
user_id
amount
Run Code Online (Sandbox Code Playgroud)
首先,我想基于id更新一行
$amount = 123; // dyanamic value
$sql = "UPDATE tbl_user SET amount=amount-'$amount' WHERE id='$id' LIMIT 1 ";
Run Code Online (Sandbox Code Playgroud)
现在我想获得量数列的更新值我已应用此sql
$sql = "SELECT amount FROM tbl_user WHERE id='$id' LIMIT 1 ";
Run Code Online (Sandbox Code Playgroud)
我的问题是我可以结合以上sql或任何单个查询来实现上述任务吗?
Edp*_*per 28
你可以模仿的最好的是使用两行查询,可能使用如下变量:
UPDATE tbl_user SET
amount = @amount := amount-'$amount'
WHERE id='$id' LIMIT 1;
SELECT @amount;
Run Code Online (Sandbox Code Playgroud)
你可以做的最好的事情是创建一个Stored Procedure
像:
DELIMITER //
CREATE PROCEDURE `return_amount` ()
BEGIN
UPDATE tbl_user SET
amount = @amount := amount-'$amount'
WHERE id='$id' LIMIT 1;
SELECT @amount;
END //
Run Code Online (Sandbox Code Playgroud)
然后打电话给Stored Procedure
你PHP
.
注意:PostgreSQL
有这种选项使用如下所示的RETURNING
语句:
UPDATE tbl_user SET amount=amount-'$amount'
WHERE id='$id' LIMIT 1
RETURNING amount
Run Code Online (Sandbox Code Playgroud)
看到这里
一个函数可以很容易地做到这一点。听起来您想限制代码连接到数据库的次数。使用存储函数或过程,您只需建立一个连接。是的,存储的函数内部有两个查询(更新然后选择),但是这些是在服务器端执行的,而不会停下来与客户端进行往返。
http://sqlfiddle.com/#!2/0e6a09/1/0
这是我的桌子骨架:
CREATE TABLE tbl_user (
id VARCHAR(100) PRIMARY KEY,
user_id VARCHAR(100),
amount DECIMAL(17,4) );
INSERT INTO tbl_user VALUES ('1', 'John', '100.00');
Run Code Online (Sandbox Code Playgroud)
和建议的功能:
CREATE FUNCTION incrementAmount
(p_id VARCHAR(100), p_amount DECIMAL(17,4))
RETURNS DECIMAL(17,4)
BEGIN
UPDATE tbl_user
SET amount = amount + p_amount
WHERE id = p_id;
RETURN (SELECT amount FROM tbl_user WHERE id = p_id);
END
//
Run Code Online (Sandbox Code Playgroud)
然后你只需运行一个查询,一个SELECT
你刚刚创建的函数:
SELECT incrementAmount('1', 5.00)
Run Code Online (Sandbox Code Playgroud)
查询结果为:
105
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
32691 次 |
最近记录: |