需要获取用户连续完成一项习惯(连续)的天数。这意味着最近的连续记录(今天倒退),而不一定是最长的连续记录。
插入以下日期后,我预计 4
- 2023-09-14
- 2023-09-15
- 2023-09-16
- 2023-09-17
这个查询始终返回 1,我哪里出错了?
SELECT s.habit, MAX(s.streak) AS currentStreak
FROM ( SELECT IF(@prev = o.habit_id AND o.date = @prevDate + INTERVAL 1 DAY
, @streak := @streak + 1
, @streak := 1
) AS streak
, @prev := o.habit_id AS habit
FROM ( SELECT t.habit_id
, DATE(t.created_at) AS `date`
FROM habit_progress_logs t
CROSS
JOIN (SELECT @prev := NULL, @prevDate := NULL, @streak := 1) i
GROUP BY t.habit_id, DATE(t.created_at)
ORDER BY t.habit_id, DATE(t.created_at)
) o
) s
WHERE s.habit = 4
GROUP BY s.habit
您忘记了为每一行进行设置
@prevDate
,并且您返回的是最大条纹而不是最近的条纹。如果您使用 MySQL >= 8.0,您可以使用窗口函数,而不是表达式中已弃用的用户变量设置:
第一个CTE使用DENSE_RANK()为我们提供了日期序列分组(
rnk
添加用于说明):第二个CTE执行 GROUP BY 并添加ROW_NUMBER():
如果您陷入 MySQL < 8.0 的困境:
这是一个db<>fiddle