表结构 user_id/用户 ID date/签到日期 isign/当日是否签到
使用场景:筛选最大的连续签到天数为 xx 天的签到记录, 只在管理后台查询,没有任何优化,百万级别能不能做到 2s 之内啊?
需要分页查询
select * from
(SELECT t3.user_id,max(t3.date3) as sign FROM
(SELECT t2.user_id,count(t2.date2) date3 FROM
(SELECT t1.user_id,DATE_SUB(t1.date,INTERVAL t1.ranking day) as date2 FROM
(SELECT *,
row_number() over (PARTITION by user_id order by date) as ranking
from sign
where sign_in=1)t1/*① 筛选出每个 user 的签到日期,并排序*/
)t2/*② 签到日期减去签到排名,如果是连续签到,则得到的日期相同*/
GROUP BY t2.user_id,t2.date2)t3 /*③ 按照 user_id 分组,分别求出各连续签到的时间*/
GROUP BY t3.user_id;)t4 where t4.sign=xx /*④ 求出最大值,并筛选*/
这个 sql 修改自知乎 的问题 2,
1
LLaMA2 2021-12-25 10:48:59 +08:00
不擅长 sql
我发表下个人愚见 每日 0 点使用您的 sql 查处前一天的情况,缓存好,记为数据 1 后台每次刷新时,先查询最后一条签到记录,缓存下该条记录的插入时间,记为数据 2 然后只查询今天的签到记录,并把记录中涉及的人的签到时长在数据 1 的基础上追加 1 天,记为数据 4 输入到前台 如果之后每次刷新是,如果最后一条签到记录没有变化,则直接输入,否则继续在数据 4 的基础上追加,并修改数据 2 |