-
慕森王
在用户主表里面添加统计字段,用户每消费一笔,在数值上加上去
-
米琪卡哇伊
用redis SortedSet(有序集合)做
-
慕尼黑的夜晚无繁华
redis sorted set
-
PIPIONE
还是定时任务算报表比较靠谱,这种需求,不该做成实时的,各种逻辑 (支付,退款,使用优惠券,使用积分)各种埋点,如果是这样太复杂,定时任务 报表统计比较稳当,当然如果业务简单,可以考虑vilay的思路,不过家在用户表里面感觉不合适,新建表吧
-
ITMISS
这种比较推荐的就是以uid为维度建表,以后各种关于uid的统计数据都放到里面,产生消费就更新这个字段的数据,这种也不会产生效率问题,只是多更新一个字段而已。觉得用redis有序集合,挺方便,但是如果涉及到要把这些数据做列表并支持搜索之类的,那就还是要同步到mysql,就比较麻烦了。
-
交互式爱情
提供个思路:1、每天固定一个时间点(比如半夜12点)查询用户消费记录,结果存入缓存(redis/memcached/文件缓存或其它)2、用户每次消费时向用户消费记录缓存里加上消费金额3、页面取出缓存数据展示
-
莫回无
select user_id,sum(cash) total_fee from orders
group by user_id
order by total_fee DESC
LIMIT 1;
效率应该不会很低把?想查前几名就limit几
-
12345678_0001
赞同楼上的redis方案,最简单有效的方法就是缓存,你的消费排行榜可以在夜间更新,当然了也可以设定时间单位,其它方法可能就更麻烦了
-
临摹微笑
“实时“ “最高” ,通过这两点,我get到的信息是并不需要所有的排名,只需要取出排名靠前的展示出来,将这部分数据缓存。考虑到另一个关键点“实时”,楼主可以根据客户的平均消费额和消费频次,以及排名靠前的客户总额差额设计一个算法,比如我们仅取前10名的数据,最十名总消费额1万,当其他用户进行消费时,就与1万这个临界值进行比较。如果超过一万,则更新缓存。同时也监控前10人的消费情况,如果金额变动影响了排名则同时更新缓存
-
海绵宝宝撒
先按照uid group by,然后再按照sum的值倒排
SELECT uid,SUM(price) AS total_price FROM table GROUP BY uid ORDER BY total_price DESC