
每天打卡会在数据库存储一条记录,因为要考虑补签的因素,所以不能直接存连续天数,如何根据日期查询连续打卡了多少天呢? 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 用一个字段记录开始连续打卡的日期? |
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 月 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 数据过期,就在过期时加一个回调记录下过期时的天数和过期时间,要调用记录就反推过期时间和天数,扔给前端计算就行了 |