Hello Developers / Programmers
我正在我的网站上工作取款功能。
所以它就像这样
我需要按照用户ID总计我拥有的3张表,状态为' 1' ,并由用户请求提款减去输入金额
这是我的3张桌子
tbl_bonus_1
id | amount | user_id | status
1 20 1 1
2 20 1 1
3 20 3 1
tbl_bonus_2
id | amount | user_id | status
1 30 1 1
2 30 1 1
3 30 3 1
tbl_bonus_3
id | amount | user_id | status
1 40 1 1
2 40 1 1
3 40 3 1
现在我需要通过USER ID获取所有3个表并获得它的总和。 获得总数后,我需要减去USER的输入数量 并将状态更新为0,以便用户无法再次撤回。
我正在使用Codeigniter 3.1.5
答案 0 :(得分:0)
select user_id, sum(amount)
from
(select * from tbl_bonus_1
union
select * from tbl_bonus_2
union
select * from tbl_bonus_3) tt
where status = 1
group by user_id
样本: http://sqlfiddle.com/#!9/7f1807e/1
和UPDATE(单个用户):
UPDATE tbl_bonus_1 t1 INNER JOIN tbl_bonus_2 t2
ON t1.user_id = t2.user_id
INNER JOIN tbl_bonus_3 t3
ON t1.user_id = t3.user_id
SET t1.amount = 0, t2.amount = 0, t3.amount = 0
WHERE t1.user_id = 1;
答案 1 :(得分:0)
实际上,如果您想管理余额,您不想从这些表中减去。您需要添加第4个表,即提款金额,以便您可以捕获交易。如果您在3个表中总共有160个,并且用户提取150,那么您将如何确定减少哪个表。
我建议将所有这些合并到1个trasaction表中,并在那里捕获金额。
因此,为了得到你需要的东西,你需要利用需要传递给查询的变量。下面将为您提供您的要求。话虽如此,这不是正确的方法。此外,无法确定要减去退出的3个余额中的哪一个。这不是交易分类账的工作方式,而且由于很多原因我现在不打算进入。在这个答案的底部是我建议你应该建立你的表。在捕获更多/更好的数据的同时,您将能够更轻松地获取信息。
如何从当前结构中获取数据:
set @withdraw = 150.00, @user = 1;
select user_id, sum(amount) as prevBalance
, @remainingBalance := if(@user = user_id,sum(amount)-@withdraw,sum(amount)) as remainingBalance
from
(select * from tbl_bonus_1
union
select * from tbl_bonus_2
union
select * from tbl_bonus_3) balance
group by user_id;
如何构建架构:
CREATE TABLE ledger (id int NOT NULL AUTO_INCREMENT
,user_id int
, amount decimal(5,2)
, transaction_type varchar(20)
,PRIMARY KEY (ID));
INSERT INTO ledger VALUES
(null,1,20,'Bonus1'),
(null,1,20,'Bonus1'),
(null,3,20,'Bonus1'),
(null,1,30,'Bonus2'),
(null,1,30,'Bonus2'),
(null,3,30,'Bonus2'),
(null,1,40,'Bonus3'),
(null,1,40,'Bonus3'),
(null,3,40,'Bonus3'),
(null,1,-150,'Withdraw')
然后您需要做的就是运行以下查询。
select user_id, sum(amount) balance from ledger
group by user_id;