如何获取近半个月没有活跃的用户?

用户表 user 主键id
用户活跃日志表 user_active_log 外键user_id 字段活跃时间active_time
问题是:
如果查询近半个月没有活跃的用户呢?

附言 1  ·  4个月前

当筛选出最近半个月内没有活跃的用户,我们将发送激活短信。只激活三次 三次之后还是没有活跃 将放弃。每次激活间隔时间为半个月。这个又将如何应对?

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 18

SELECT user.id, user.name, user.email FROM user LEFT JOIN user_active_log ON user.id = user_active_log.user_id WHERE user_active_log.active_time < DATE_SUB(NOW(), INTERVAL 15 DAY)

4个月前 评论
AloneUtopia
select user.id,max(log.active_time) as last_active_time from user left join user_active_log as log on log.user_id = user.id group by user.id having active_time < xxx or active_time is null
4个月前 评论

select * from user where not exists(select 1 from user_active_log where user_active_log.user_id = user.id and unix_timestamp(user_active_log.active_time) > unix_timestamp() - 15 * 86400)

4个月前 评论
晏南风 4个月前
无名者 4个月前
小猪蹄子 (作者) 4个月前

SELECT u.id as '用户id', u.username as '用户名', u.email as '邮箱', MAX(ul.active_time) as '最后一次活跃时间' FROM user u LEFT JOIN user_active_log ul ON u.id = ul.user_id WHERE ul.active_time <= DATE_SUB(CURDATE(), INTERVAL 14 DAY) GROUP BY u.id HAVING COUNT(ul.user_id) = 0;

4个月前 评论

如果有激活三次的限制,感觉可以直接在user上加一个激活次数吧,激活次数默认1,发送一次加1,只要活跃了则把这个活跃数重置为1,然后,筛选不活跃用户时加上激活次数不等于5就可以了

4个月前 评论
小猪蹄子 (作者) 4个月前
xiaofeishu (楼主) 4个月前

以最后登陆日期来查询数据, 晚上 12 点过后查询,并发送激活邮件

select uid,max(active_time) from user_active_log group by uid ; -- 这样查询很耗费性能,人少还好,人一多就挂了

建议在 users 表加一个 active_time 字段,登陆就更新,这样查询很方便,也是比较快的。

只激活三次 三次之后还是没有活跃 将放弃。 这是个伪需求吧?

查询 15/30/45 天前当天登陆过用户,并发生激活通知,在早的就不需要了。这个放到任务计划中就行了。

4个月前 评论
xiaofeishu (楼主) 4个月前
周小云 4个月前
aodaobi

file

4个月前 评论
xiaofeishu (楼主) 4个月前

sql上函数会使索引失效,还是尽量加字段从业务上解决

4个月前 评论
巴啦啦

可以将每日活跃用户id存入位图中,每日一个位图。查询最近半个月的活跃用户,就是查询十五个位图做或运算。将用户id取出来。
上面这一步,只能获取活跃用户。在用户注册时,也维护一个位图,存储着所有用户的id。最后做一个与运算,筛选出来的就是不活跃的用户了。
这是一个利用位图非常典型的案例。希望对你有帮助哦。

4个月前 评论

这个简单,我来:

select distinct user_id from user_active_log  a left join user u on a.user_id=u.id where a.active_time > '{date of 15d before}' and u.id is null  

只考虑查出结果的话,就是这样了,最简单的一个sql

3个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!