没有做过连续签到求一个签到与连续签到的 逻辑
认证高级PHP讲师
如果每次签到都存一条记录,那么这张表一定非常巨大。
看看现在各方推出的签到和连续签到功能,基本上都是以月为单位,也有部分是在活动周期为单位,这样有一个好处——只需要用一个字段保存整月的签到情况就好,不需要拆成30条记录——因为不需要按签到的日期去查有哪些人,所以不需要精确记录每一天的签到用于查询。因为只需要在打开这个人的页面的时候显示他哪些天签到了,从一个字段里一次性读出来所有签到数据,前端显示即可。
为了便于查询签到天数和连续签到天数,可以分别用一个字段来保存。签到的时候直接根据当前签到记录很容易算出来这两个数据。有了这两个数据字段,要查询符合条件的用户也就是一个SQL的事情。
道理差不多就是这些了,自己想想试试吧。
刚好整理了一份签到数据统计的项目SQL语句。
比如:1.统计每天的每小时用户签到情况?2.统计每天的用户签到数据和每天的增量数据?3.统计签到天数相同的用户数量?4.统计每个用户的连续签到时间?5.数据表如何设计?
文章地址:Mysql 常用SQL语句集锦
在文章的后半部分!
如果只是连续签到的话可以考虑建一张表记录
连续签到天数 上次签到时间
每次签到时根据上次签到时间判断是否连续,也可以加月份的判断
首先从设计数据库开始,签到表应该有用户id,签到类型,签到积分,连续签到数,签到时间等字段。给签到时间字段加索引。用户点击签到后,你可以从数据库中按照时间降序,获取该用户最新的一条签到数据,首先这一条数据判断当天他是否已经签过到了,如果判断他当天已经签到了,那么不允许他再次签到,如果没有签过到,那么在判断是否是昨天的签到数据,如果是昨天的签到数据的话,我在插入新的数据时,连续签到数字段的值为昨天连续签到数+1,否则连续签到数为1插入到数据库中。
对于显示连续签到数的时候呢,我们同样获取用户的最新一天签到记录,如果这天数据不是今天或者昨天的签到数据的话,我们现实连续签到0天,如果是今天或则昨天的签到数据的话就显示连续签到数字段的值。
最后我没有做过签到功能,这些都是我自己的想法。如果有误还望大神们指点指点我,本菜鸟一名。大神求带。哈哈哈
主要看你项目对签到和连续签到的要求针对这个签到和连续签到的问题,我觉得从两个方面去处理1、把每日签到,记录到数据库,考虑到量大的问题,可以分表兼容,因为这个都是简单的业务逻辑,不会链表操作,根据uid来分表就可以,这个可以实现签到和连续签到的查询2、使用redis计数实现连续签到;当用户签到的时间和当月天数时间一致的话,就是连续签到。在每个月1好,就可以重置数据
redis 的bitmap 参考一下
如果每次签到都存一条记录,那么这张表一定非常巨大。
看看现在各方推出的签到和连续签到功能,基本上都是以月为单位,也有部分是在活动周期为单位,这样有一个好处——只需要用一个字段保存整月的签到情况就好,不需要拆成30条记录——因为不需要按签到的日期去查有哪些人,所以不需要精确记录每一天的签到用于查询。因为只需要在打开这个人的页面的时候显示他哪些天签到了,从一个字段里一次性读出来所有签到数据,前端显示即可。
为了便于查询签到天数和连续签到天数,可以分别用一个字段来保存。签到的时候直接根据当前签到记录很容易算出来这两个数据。有了这两个数据字段,要查询符合条件的用户也就是一个SQL的事情。
道理差不多就是这些了,自己想想试试吧。
刚好整理了一份签到数据统计的项目SQL语句。
比如:
1.统计每天的每小时用户签到情况?
2.统计每天的用户签到数据和每天的增量数据?
3.统计签到天数相同的用户数量?
4.统计每个用户的连续签到时间?
5.数据表如何设计?
文章地址:Mysql 常用SQL语句集锦
在文章的后半部分!
如果只是连续签到的话可以考虑建一张表记录
每次签到时根据上次签到时间判断是否连续,也可以加月份的判断
首先从设计数据库开始,
签到表应该有用户id,签到类型,签到积分,连续签到数,签到时间等字段。给签到时间字段加索引。
用户点击签到后,你可以从数据库中按照时间降序,获取该用户最新的一条签到数据,首先这一条数据判断当天他是否已经签过到了,如果判断他当天已经签到了,那么不允许他再次签到,如果没有签过到,那么在判断是否是昨天的签到数据,如果是昨天的签到数据的话,我在插入新的数据时,连续签到数字段的值为昨天连续签到数+1,否则连续签到数为1插入到数据库中。
对于显示连续签到数的时候呢,我们同样获取用户的最新一天签到记录,如果这天数据不是今天或者昨天的签到数据的话,我们现实连续签到0天,如果是今天或则昨天的签到数据的话就显示连续签到数字段的值。
最后我没有做过签到功能,这些都是我自己的想法。如果有误还望大神们指点指点我,本菜鸟一名。大神求带。哈哈哈
主要看你项目对签到和连续签到的要求
针对这个签到和连续签到的问题,我觉得从两个方面去处理
1、把每日签到,记录到数据库,考虑到量大的问题,可以分表兼容,因为这个都是简单的业务逻辑,不会链表操作,根据uid来分表就可以,这个可以实现签到和连续签到的查询
2、使用redis计数实现连续签到;当用户签到的时间和当月天数时间一致的话,就是连续签到。在每个月1好,就可以重置数据
redis 的bitmap 参考一下