[MySQL] Lv3. 이용자의 포인트 조회하기

Jaeyoung Ko·2024년 10월 23일
  • 상황: 이번에는 이용자들 별로 획득한 포인트를 학생들에게 이메일로 보내려고 합니다. 이를 위한 자료를 가공해봅시다. 특히 users 테이블에는 있으나 point_users 에는 없는 유저가 있어요. 이 유저들의 경우 point를 0으로 처리합시다.

  • 데이터 설명
    - users 테이블은 스파르타 코딩클럽에 가입한 유저들의 정보를 날짜별로 기록한 테이블입니다.
    - user_id: 익명화된 유저들의 아이디(varchar255)
    - created_at: 아이디 생성 날짜(timestamp)
    - updated_at: 정보 업데이트 날짜(timestamp)
    - name: 익명화된 유저들의 이름(varchar255)
    - email: 이메일(varchar255)
    - point_users 테이블은 스파르타코딩클럽 가입 유저들의 포인트에 대한 정보를 기록한 테이블입니다.
    - point_user_id: point_users 테이블의 행을 구별하기 위한 key(varchar255)
    - created_at: 아이디 생성 날짜(timestamp)
    - updated_at: 정보 업데이트 날짜(timestamp)
    - user_id: 익명화된 유저들의 아이디(varchar255)
    - point: 보유하고 있는 포인트(int)

  • 문제: 다음과 같은 결과 테이블을 만들어봅시다.
    • user_id: 익명화된 유저들의 아이디
    • email: 유저들의 이메일
    • point: 유저가 획득한 포인트
      • users 테이블에는 있지만 point_users에는 없는 user는 포인트가 없으므로 0 으로 처리
      • 포인트 기준으로 내림차순 정렬

절망적이게도 이번 예제를 풀려면 앞서 쓴 user 테이블과 point_users 테이블의 인스턴스들의 속성값이 예제와 같아야 한다. join을 사용하는 예제이기에 속성값이 공유되는 부분이 존재하는 예시이기 때문이다.

따라서 별도의 실행환경 없이 쿼리만 작성하겠다.


쿼리:

select user_id, email, IFNULL(point, 0) as point
from user LEFT JOIN point_users ON user.user_id = point_users.user_id
order by point DESC;

실행환경에 적용을 못하니까 결과값을 몰라 아쉽지만

예제 정답으로 나온 부분은 COALESCE()를 이용한

SELECT
u.user_id, u.email,
COALESCE(p.point,0) as point
FROM
users u
left JOIN
point_users p ON u.user_id = p.user_id
order by p.point desc;

이었다.

사실 nested로 만들 생각도 했는데 postgresql 쓰던게 오래 전이라 COALESCE()의 존재를 잊고 있었다. 확실히 결측값 핸들링을 하는데에는 이 쪽이 편해보인다.

profile
안녕하세요, 고재영입니다. 언제나 즐겁게 살려고 노력합니다.

0개의 댓글