예전에도 구현해 본 경험이 있지만 이번 학교 프로젝트에서도 비슷한 로직을 구현하게 되었다.

저번 프로젝트는 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;

'Mysql' 카테고리의 다른 글

rds 사용기  (0) 2020.04.30

1. ec2에 직접 설치한 mysql과 달리 GRANT ALL PRIVILEGES ON *.* TO... 통하지 않는다. 

https://eventhorizon.tistory.com/119 

 

Aws rds (mysql) 신규 계정 추가

1. 계정 추가 CREATE USER 'dbuser'@'client-host-ip' IDENTIFIED BY 'password'; 2. 권한 부여 기존 mysql 설정처럼, 와일드카드로 권한을 부여하게 되면 에러 발생 GRANT ALL PRIVILEGES ON * . * TO 'dbuser'@'..

eventhorizon.tistory.com

-참고 블로그

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, REFERENCES, INDEX, 
ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, 
REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, 
EVENT, TRIGGER ON *.* TO 'user_name'@'ip_address' WITH GRANT OPTION;

이렇게 권한을 주어야 한다. 한참 헤맸다. 

2. php에서 연결할 때 $DB_HOST에 "127.0.0.1" 이 아닌 rds 엔드포인트 주소를 주어야 한다.

3. rds 환경 설정 할 때

'퍼블릭 액세스 가능성'을 예로 반드시 표시해야 한다. 그냥 기본 설정 값으로 지나쳤다가 안돼서 또 헤맸다. 

 

08/14 수정 Server version: 8.0.17 Source distribution

root 권한 

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER ON *.* TO 'root'@'%' with grant option; 을 따로 주지 않으니 

ERROR 1410 (42000): You are not allowed to create a user with GRANT 에러 발생. 버전 차이인가 싶다. 

그래서 루트에 대한 권한을 주고, 사용자를 생성한 후 

  1. % 는 모든 계정에서 접속을 의미한다. 
  2. 외부접속을 위해서는 root가 %, localhost 모두 허용해주어여 한다.
  3. 퍼블릭 엑세스 가능성 생각하기

create user 'hannah'@'219.251' identified by '**';

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER ON *.* TO 'hannah'@'219.251' with grant option;

create user 'root'@'localhost' identified by '’;

 

 

 

'Mysql' 카테고리의 다른 글

mysql DATEDIFF 함수를 이용한 로직  (0) 2020.12.10

+ Recent posts