1주일 미접시 비행거리 감소

YeopKing·2023년 7월 7일
0

mysql

목록 보기
1/1
post-thumbnail

요구사항

방문 횟수 주 1회 미만 일 경우
유저 비행거리 -10점을 한다

해결방법

프로시저를 생성해
유저 비행거리 -10 점 update query
1주일 미접 로그 insert query
매일 자정에 스케줄러를 돌린다.

주1회 미만일 경우 비행거리 점수를 -10점 하기위해선
비행거리 로그에 로그인 로그를 남겨야하고
type=LOGIN 으로 1일 1회로 로그를 쌓는다.

일주일중에 로그인 로그가 없다면
유저 비행거리 -10점 , 그리고 NOT_WEEK_LOGIN 타입 -10점을 남긴다.

하지만 장기간 미접이라면 일주일 뒤부터 매일 -10점씩 감소되고
NOT_WEEK_LOGIN 로그가 남길 것이다.
그래서
일주일중에 LOGIN,NOT_WEEK_LOGIN 두개의 조건을 걸어야 한다.

DELIMITER ;;
CREATE
	DEFINER = `root`@`%` PROCEDURE `updateFlyingDistanceForNotLoggedIn`()
	BEGIN
	DECLARE currentDate DATE;
DECLARE logCount INT;

SET currentDate = CURDATE() - INTERVAL 7 DAY;

-- 로그인 로그가 없는 사용자들의 flying_distance 값을 -10으로 업데이트
UPDATE member
SET flying_distance = flying_distance - 10
WHERE member_idx NOT IN (SELECT DISTINCT member_idx
                         FROM flying_distance_log
                         WHERE flying_distance_type = 'LOGIN'
                            or flying_distance_type = 'NOT_LOGIN_WEEK'
                             AND created_date >= currentDate);

-- 일주일 동안 로그인 로그가 없는 사용자들에 대해 NOT_LOGIN_WEEK 타입의 로그를 저장
INSERT INTO flying_distance_log (member_idx, flying_distance_type, point, plus_minus_type, created_date,
                                 modified_date)
SELECT m.member_idx, 'NOT_LOGIN_WEEK', -10, 'MINUS', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP
FROM member m
         LEFT JOIN (SELECT DISTINCT member_idx
                    FROM flying_distance_log
                    WHERE flying_distance_type = 'LOGIN'
                       or flying_distance_type = 'NOT_LOGIN_WEEK'
                        AND created_date >= currentDate) AS log ON m.member_idx = log.member_idx
WHERE log.member_idx IS NULL;
END;;
DELIMITER ;

프로시저를 생성하고
스케줄러를 자정에 매일 실행한다.

DELIMITER //

CREATE EVENT updateFlyingDistanceForNotLoggedIn
ON SCHEDULE
	EVERY 1 DAY
    STARTS CURRENT_DATE + INTERVAL 1 DAY
	COMMENT '매일 자정에 flying_distance 업데이트 프로시저 실행'
DO
CALL updateFlyingDistanceForNotLoggedIn();

DELIMITER ;


1주일 미접시 로그가 잘 남겨지며 로그 남겼을시
유저는 -10점 updateQuery가 날라가며

그다음날 자정에 실행했을땐
로그인 및 1주일 미접 타입의 로그가 있다면
insert,update query가 실행 되지 않는다.

profile
좀 더 나은 내일을 위해

0개의 댓글