MySql 如何查询连续打卡记录?

2019-12-20 10:58:19 +08:00
 shaweren

每天打卡会在数据库存储一条记录,因为要考虑补签的因素,所以不能直接存连续天数,如何根据日期查询连续打卡了多少天呢? id
userid
datetime

5993 次点击
所在节点    MySQL
10 条回复
wps353
2019-12-20 11:05:46 +08:00
用 redis 的位图来实现这个功能,我觉得比 MySQL 来实现好一点。
qmzhixu
2019-12-20 11:11:54 +08:00
用一个字段记录开始连续打卡的日期?
BBCCBB
2019-12-20 11:15:19 +08:00
redis 位图或者自己手动存 int 类型, 因为 int 有 32 位, 每个月一条 int 数据. 这样玩也可以.
shaweren
2019-12-20 11:16:27 +08:00
@qmzhixu 嗯,可以试试,每次打卡存都存开始日期,查的话就按最新一条记录的开始日期和结束统计,补签就把所有开始日期更新到前一天。脑洞果然大开。
shaweren
2019-12-20 11:19:04 +08:00
@BBCCBB
@wps353 redis 还不太熟,回头研究下
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
c6h6benzene
2019-12-20 13:51:49 +08:00
找一张连续的时间维度表 left join datetime,算 row_number 和 running total 就好了(不确定 mysql 有没有 sum over rows unbounded preceding 这种写法)
pelloz
2019-12-20 14:00:50 +08:00
我会把数据读出来用程序处理,而不是直接用 sql 写。
一般也就是两种情况,月 /季 /年末需要统计一下,或者单用户查询自己的。数据量都算不上大,放程序内存里面处理很快。
optional
2019-12-20 14:13:34 +08:00
单用户查询没啥好优化的,拉一年要也就 300 条数据。
a719031256
2019-12-23 11:47:34 +08:00
这个可以用 redis 把,打卡的时候读取 redis,没读到就是第一次打卡,读到就+1 并更新过期时间,如果没连续打卡导致 redis 数据过期,就在过期时加一个回调记录下过期时的天数和过期时间,要调用记录就反推过期时间和天数,扔给前端计算就行了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/630771

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX