有一张用户账号表user
有一张用户的钱记录表 user_platform_money
用户每充值或者消费一笔钱就会在user_platform_money做一条记录.
其中的type字段区分充值还是消费.(type=0充值,1消费)
现在查询这个用户的账号信息(包括用户余额)
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
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
为什么这么写,没有钱的用户就不显示呢
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
left join 是与左边的为准,来匹配
需要先把充值表分组 在根据id一样查询大概思路是这样 还得自己做
这个问题首先是设计问题,用户的余额应当有专门的表和字段存储,而不是每次查询都得去计算所有的交易
恕我不敬:你不懂设计.
@Moon.Orm塑造Orm经典:
这个本来就应该按Zux的设计才正常,那交易信息只是流水,是用于核对用的。账户余额应该独立于流水外的,根据业务设计不同的科目(余额类型),最后加以统计。
如果按照题目所示的的做法,小数据量也就罢了,数据量大了根本没办法往下做。
@Moon.Orm塑造Orm经典:
等你以后系统用久了就知道了,不光是数据量的问题,还有业务逻辑变化的问题
什么,今天搞冲100送100?
什么,3号开始花50送30?
明天又改充值逻辑了,那个谁,赶快的,过来把这段SQL再加个修正