表结构 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,
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.