每天打卡会在数据库存储一条记录,因为要考虑补签的因素,所以不能直接存连续天数,如何根据日期查询连续打卡了多少天呢?
id
userid
datetime
1
wps353 2019-12-20 11:05:46 +08:00
用 redis 的位图来实现这个功能,我觉得比 MySQL 来实现好一点。
|
2
qmzhixu 2019-12-20 11:11:54 +08:00 1
用一个字段记录开始连续打卡的日期?
|
3
BBCCBB 2019-12-20 11:15:19 +08:00
redis 位图或者自己手动存 int 类型, 因为 int 有 32 位, 每个月一条 int 数据. 这样玩也可以.
|
4
shaweren OP @qmzhixu 嗯,可以试试,每次打卡存都存开始日期,查的话就按最新一条记录的开始日期和结束统计,补签就把所有开始日期更新到前一天。脑洞果然大开。
|
6
lihongjie0209 2019-12-20 11:41:41 +08:00 1
很简单啊
假如要查 用户 1 1 月 1 号 - 1 月 5 日连续打卡的次数, 建立两个数组 全部签到应该的结果: [1 月 1 日, 1 月 2 日, 1 月 3 日, 1 月 4 日, 1 月 5 日] 用户 1 签到的结果: [1 月 1 日, 1 月 2 日,1 月 5 日] 两个指针一起, 遇到不匹配的停止, 计数就可以了, 连续打卡 10 年也就 3650 天, 全部放在内存中做就可以了, 不需要 redis |
7
c6h6benzene 2019-12-20 13:51:49 +08:00 via iPhone
找一张连续的时间维度表 left join datetime,算 row_number 和 running total 就好了(不确定 mysql 有没有 sum over rows unbounded preceding 这种写法)
|
8
pelloz 2019-12-20 14:00:50 +08:00
我会把数据读出来用程序处理,而不是直接用 sql 写。
一般也就是两种情况,月 /季 /年末需要统计一下,或者单用户查询自己的。数据量都算不上大,放程序内存里面处理很快。 |
9
optional 2019-12-20 14:13:34 +08:00
单用户查询没啥好优化的,拉一年要也就 300 条数据。
|
10
a719031256 2019-12-23 11:47:34 +08:00
这个可以用 redis 把,打卡的时候读取 redis,没读到就是第一次打卡,读到就+1 并更新过期时间,如果没连续打卡导致 redis 数据过期,就在过期时加一个回调记录下过期时的天数和过期时间,要调用记录就反推过期时间和天数,扔给前端计算就行了
|