› 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 · Dec 20, 2019 · 7185 views
    This topic created in 2471 days ago, the information mentioned may be changed or developed.

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

    10 replies  •  2019-12-23 11:47:34 +08:00
    wps353
        1
    wps353  
       Dec 20, 2019
    用 redis 的位图来实现这个功能,我觉得比 MySQL 来实现好一点。
    qmzhixu
        2
    qmzhixu  
       Dec 20, 2019   ❤️ 1
    用一个字段记录开始连续打卡的日期?
    BBCCBB
        3
    BBCCBB  
       Dec 20, 2019
    redis 位图或者自己手动存 int 类型, 因为 int 有 32 位, 每个月一条 int 数据. 这样玩也可以.
    shaweren
        4
    shaweren  
    OP
       Dec 20, 2019
    @qmzhixu 嗯,可以试试,每次打卡存都存开始日期,查的话就按最新一条记录的开始日期和结束统计,补签就把所有开始日期更新到前一天。脑洞果然大开。
    shaweren
        5
    shaweren  
    OP
       Dec 20, 2019
    @BBCCBB
    @wps353 redis 还不太熟,回头研究下
    lihongjie0209
        6
    lihongjie0209  
       Dec 20, 2019   ❤️ 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  
       Dec 20, 2019 via iPhone
    找一张连续的时间维度表 left join datetime,算 row_number 和 running total 就好了(不确定 mysql 有没有 sum over rows unbounded preceding 这种写法)
    pelloz
        8
    pelloz  
       Dec 20, 2019
    我会把数据读出来用程序处理,而不是直接用 sql 写。
    一般也就是两种情况,月 /季 /年末需要统计一下,或者单用户查询自己的。数据量都算不上大,放程序内存里面处理很快。
    optional
        9
    optional  
       Dec 20, 2019
    单用户查询没啥好优化的,拉一年要也就 300 条数据。
    a719031256
        10
    a719031256  
       Dec 23, 2019
    这个可以用 redis 把,打卡的时候读取 redis,没读到就是第一次打卡,读到就+1 并更新过期时间,如果没连续打卡导致 redis 数据过期,就在过期时加一个回调记录下过期时的天数和过期时间,要调用记录就反推过期时间和天数,扔给前端计算就行了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2382 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 04:59 · PVG 12:59 · LAX 21:59 · JFK 00:59
    ♥ Do have faith in what you're doing.