이 문제는 다음 조건을 모두 만족하는 user_id를 찾는 문제이다
즉 핵심은 다음 두가지이다.
SELECT user_id
FROM emails as e
JOIN texts as t
ON t.email_id = e.email_id
WHERE e.signup_date != t.action_date
AND (date(t.action_date) - date(e.signup_date)) = 1;
!= 조건 추가결과값은 동일해서 문제는 통과했지만 다시 쿼리문을 보니 문제가 있었다.
e.signup_date != t.action_date
이미 날짜 차이가 1인 경우(date(t.action_date) - date(e.signup_date))만 필터링하고 있기 때문에 해당 조건은 의미 없이 중복된 조건이였다.
문제 조건 중 중요한 부분이 인증 상태가 'Confirmed'여야 한다는 것인데
작성한 쿼리에 이 조건을 넣지 않았다.
이렇게 되면 그냥 날짜 차이가 1인 조건만 계산되어서 'Not confirmed' 데이터까지 포함될 수 있다는 점이다.
date(t.action_date) - date(e.signup_date)
의도를 명확하게 하기위해서 함수를 사용하여 날짜를 계산하는 방법이 더 좋다고 판단했다.
결론적으로 기존 쿼리의 결과를 설명하면
실제 문제에서 원하는 정답은 가입 다음 날에 Confirmed 상태인 사용자만 포함하는 것이라는 것을 다시 상기할 필요가 있었다.
SELECT DISTINCT e.user_id
FROM emails e
JOIN texts t
ON e.email_id = t.email_id
WHERE t.signup_action = 'Confirmed'
AND DATEDIFF(t.action_date, e.signup_date) = 1;
JOIN texts t ON e.email_id = t.email_id
DATEDIFF(t.action_date, e.signup_date) = 1
t.signup_action = 'Confirmed'
DISTINCT e.user_id
이 문제는 다음 패턴으로 정리할 수 있다.
JOIN
-> 날짜 조건
-> 상태 조건
-> DISTINCT