방문 횟수 주 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가 실행 되지 않는다.