msql 计算连续签到天数

刚刚写了一个签到计算天数的sql, 记录下来. 

思路如下:

获取当前签到的最后时间(今天或昨天), 定义一个变量@i 对签到时间进行天数自减, 然后查询出当前记录签到时间是否与自减后的时间匹配.   如果匹配表示天数是连续时间. 

SELECT
count(1)
FROM
(
SELECT
date_sub(a.create_time, INTERVAL 1 DAY) create_time,
(
@i := DATE_ADD(@i, INTERVAL - 1 DAY)
) today
FROM
integral_sign a
INNER JOIN (
SELECT
@i := max(create_time)
FROM
integral_sign
WHERE
user_id = 33
AND TO_DAYS(create_time) = TO_DAYS(curdate())
OR TO_DAYS(create_time) = TO_DAYS(
DATE_ADD(curdate(), INTERVAL - 1 DAY)
)
) b
WHERE
a.user_id = 33
ORDER BY
a.create_time DESC
) c
WHERE
TO_DAYS(today) = TO_DAYS(create_time)




优化版: 减少不必要的查询数据

SELECT
count(1)
FROM
(
SELECT
date_sub(a.create_time, INTERVAL 1 DAY) signDate,
(
@i := DATE_ADD(@i, INTERVAL - 1 DAY)
) today
FROM
(
SELECT
create_time
FROM
integral_sign
WHERE
user_id = 33
ORDER BY
create_time DESC
) a
INNER JOIN (
SELECT
@i := max(create_time) AS signMax
FROM
integral_sign
WHERE
user_id = 33
AND (
TO_DAYS(create_time) = TO_DAYS(curdate())
OR TO_DAYS(create_time) = TO_DAYS(
DATE_ADD(curdate(), INTERVAL - 1 DAY)
)
)
) b
WHERE
b.signMax IS NOT NULL
AND TO_DAYS(DATE_ADD(@i, INTERVAL - 1 DAY)) = TO_DAYS(
date_sub(a.create_time, INTERVAL 1 DAY)
)
) c

原文地址:https://www.cnblogs.com/anye-15068156823/p/7272377.html