总和3个表并减去用户请求

时间:2017-09-30 02:28:28

标签: php mysql codeigniter

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

2 个答案:

答案 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;