V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
shaweren
V2EX  ›  MySQL

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

  •  
  •   shaweren · 2019-12-20 10:58:19 +08:00 · 5815 次点击
    这是一个创建于 1581 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    10 条回复    2019-12-23 11:47:34 +08:00
    wps353
        1
    wps353  
       2019-12-20 11:05:46 +08:00
    用 redis 的位图来实现这个功能,我觉得比 MySQL 来实现好一点。
    qmzhixu
        2
    qmzhixu  
       2019-12-20 11:11:54 +08:00   ❤️ 1
    用一个字段记录开始连续打卡的日期?
    BBCCBB
        3
    BBCCBB  
       2019-12-20 11:15:19 +08:00
    redis 位图或者自己手动存 int 类型, 因为 int 有 32 位, 每个月一条 int 数据. 这样玩也可以.
    shaweren
        4
    shaweren  
    OP
       2019-12-20 11:16:27 +08:00
    @qmzhixu 嗯,可以试试,每次打卡存都存开始日期,查的话就按最新一条记录的开始日期和结束统计,补签就把所有开始日期更新到前一天。脑洞果然大开。
    shaweren
        5
    shaweren  
    OP
       2019-12-20 11:19:04 +08:00
    @BBCCBB
    @wps353 redis 还不太熟,回头研究下
    lihongjie0209
        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
    c6h6benzene
        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 这种写法)
    pelloz
        8
    pelloz  
       2019-12-20 14:00:50 +08:00
    我会把数据读出来用程序处理,而不是直接用 sql 写。
    一般也就是两种情况,月 /季 /年末需要统计一下,或者单用户查询自己的。数据量都算不上大,放程序内存里面处理很快。
    optional
        9
    optional  
       2019-12-20 14:13:34 +08:00
    单用户查询没啥好优化的,拉一年要也就 300 条数据。
    a719031256
        10
    a719031256  
       2019-12-23 11:47:34 +08:00
    这个可以用 redis 把,打卡的时候读取 redis,没读到就是第一次打卡,读到就+1 并更新过期时间,如果没连续打卡导致 redis 数据过期,就在过期时加一个回调记录下过期时的天数和过期时间,要调用记录就反推过期时间和天数,扔给前端计算就行了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3664 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 10:39 · PVG 18:39 · LAX 03:39 · JFK 06:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.