首页 新闻 会员 周边 捐助

一道简单得你都可能不知道怎么写的sql题

0
悬赏园豆:100 [已解决问题] 解决于 2016-01-05 17:51

有一张用户账号表user

有一张用户的钱记录表 user_platform_money

 

用户每充值或者消费一笔钱就会在user_platform_money做一条记录.

其中的type字段区分充值还是消费.(type=0充值,1消费)

 

现在查询这个用户的账号信息(包括用户余额)

[秦时明月]的主页 [秦时明月] | 小虾三级 | 园豆:738
提问于:2015-12-31 12:07
< >
分享
最佳答案
0
select u.*,p.balance from user u
left join (select userid, (sum(case type when 1 then -1*moneyNum else 1*moneyNum end)) as balance from user_platform_money group by userid) p 
on u.userid=p.userid
收获园豆:80
MrNice | 老鸟四级 |园豆:3468 | 2015-12-31 12:32

select u.* ,sum(case m.`type` when 0 then m.money else -m.money end) as money from user u left join user_platform_money m on u.id=m.user_id

为什么这么写,没有钱的用户就不显示呢

[秦时明月] | 园豆:738 (小虾三级) | 2015-12-31 12:36
其他回答(4)
0

declare @AccountId varchar(50)
set @AccountId = 'alibaba' --设置你要查询的账户Id

--查询帐号信息
select * from user where AccountId = @AccountId

--根据充值/消费记录计算账户余额
select AccountId,sum( case type when 0 then money else -money end ) as AccountBalance
from user_platform_money where AccountId = @AccountId
group by AccountId

收获园豆:5
脚本王子 | 园豆:779 (小虾三级) | 2015-12-31 12:25
0

left join 是与左边的为准,来匹配

搁忆 | 园豆:612 (小虾三级) | 2015-12-31 15:02
0

需要先把充值表分组 在根据id一样查询大概思路是这样 还得自己做

收获园豆:15
魔战天地 | 园豆:225 (菜鸟二级) | 2015-12-31 15:36
0

这个问题首先是设计问题,用户的余额应当有专门的表和字段存储,而不是每次查询都得去计算所有的交易

Zux | 园豆:495 (菜鸟二级) | 2016-01-07 10:47

恕我不敬:你不懂设计.

支持(0) 反对(0) [秦时明月] | 园豆:738 (小虾三级) | 2016-01-07 12:11

@Moon.Orm塑造Orm经典: 

这个本来就应该按Zux的设计才正常,那交易信息只是流水,是用于核对用的。账户余额应该独立于流水外的,根据业务设计不同的科目(余额类型),最后加以统计。

如果按照题目所示的的做法,小数据量也就罢了,数据量大了根本没办法往下做。

支持(0) 反对(0) Daniel Cai | 园豆:10424 (专家六级) | 2016-01-08 09:18

@Moon.Orm塑造Orm经典: 

等你以后系统用久了就知道了,不光是数据量的问题,还有业务逻辑变化的问题

什么,今天搞冲100送100?

什么,3号开始花50送30?

明天又改充值逻辑了,那个谁,赶快的,过来把这段SQL再加个修正

支持(0) 反对(0) Zux | 园豆:495 (菜鸟二级) | 2016-01-08 14:47
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册