예전에도 구현해 본 경험이 있지만 이번 학교 프로젝트에서도 비슷한 로직을 구현하게 되었다.
저번 프로젝트는 to do 앱을 만드느라 매일 달성 여부를 체크하여 그에 따른 보상을 발급하는 로직을 만들었는데
이번에도 비슷하다. 챌린지를 참여하고 그 챌린지에 매일 참여하였는지, 챌린지 기준에 부합하는지 체크하는 로직을 만들 예정이다.
다음은 인터넷에서 참조하여 작성했던 쿼리다.
아래 로직은 특정 기간동안 체크하는 것이 아니라 결과값의 연속성만 체크하는 것이었다.
SELECT EXISTS(SELECT * FROM (SELECT curr.goalNo |
, curr.createdAt |
, 1 + DATEDIFF(curr.createdAt, MAX(streak.createdAt)) AS consecutive |
, curr.isDeleted |
FROM GoalCheck curr |
LEFT OUTER |
JOIN (SELECT * |
, CASE |
WHEN DATEDIFF(createdAt, prev) = 1 THEN 1 |
ELSE 0 |
END AS diff |
FROM (SELECT * |
, (SELECT MAX(createdAt) |
FROM GoalCheck |
WHERE goalNo = top.goalNo and GoalCheck.isDeleted = 'N' |
AND createdAt < top.createdAt) AS Prev |
FROM GoalCheck top |
) withPrev |
) streak |
ON streak.goalNo = curr.goalNo |
AND streak.createdAt <= curr.createdAt |
AND streak.diff = 0 |
WHERE curr.isDeleted = 'N' and streak.isDeleted = 'N' |
and curr.userId = ? and streak.userId = curr.userId |
and curr.goalNo = ? and streak.goalNo = curr.goalNo |
GROUP BY curr.goalNo, curr.createdAt |
ORDER BY curr.goalNo, curr.createdAt) checkDate |
WHERE consecutive = 3 AND DATE_FORMAT(createdAt, '%Y-%m-%d') = CURDATE() |
AND isDeleted = 'N' |
ORDER BY createdAt limit 1) as exist; |