예전에도 구현해 본 경험이 있지만 이번 학교 프로젝트에서도 비슷한 로직을 구현하게 되었다.
저번 프로젝트는 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; |
