쿼리문 공부 피드백(2)

HS K·2022년 12월 26일
0
post-custom-banner

개요

유저 상세정보 페이지를 조회하는 API를 만들기 위해 쿼리문을 작성했다.


1. 쿼리문 비교 및 피드백

(내가 작성한 쿼리문)

SELECT DISTINCT email,
                tu.created_at,
                last_login,
                current_email_sent_number,
                current_webpage_view,
                (SELECT Sum(total_amount)
                 FROM   tbl_payment_history
                 WHERE  status = 'true'
                        AND user_id = '58125390-edbd-11eb-8694-4153cf39c46d') AS
                total_amount
FROM   tbl_user AS tu
       LEFT JOIN tbl_payment_history AS tph
              ON tu.id = tph.user_id
WHERE  tph.status = 'true'
       AND tph.user_id = '58125390-edbd-11eb-8694-4153cf39c46d' 

(팀원분이 작성한 쿼리문)

SELECT id,
       email,
       created_at,
       last_login,
       current_email_sent_number,
       current_webpage_view,
       pht.total
FROM   tbl_user AS tu
       LEFT JOIN (SELECT user_id           uid,
                         Sum(total_amount) AS total
                  FROM   tbl_payment_history
                  WHERE  status = true
                  GROUP  BY uid) AS pht
              ON pht.uid = tu.id
WHERE  pht.total IS NOT NULL 

내가 작성한 쿼리문의 문제는 특정 유저에 대한 total_amount, email, created at, last_login 등 여러 속성들을 조회할뿐,
status='true'인 모든 user에 대한 total_amount, email, created at, last_login을 조회하지 않는다는 점에 있다. (또한 user_id를 직접 기입했기 때문에 실용성이 없다) 따라서 나는 status='true'인 조건에 대한 모든 유저의 total_amount, email, created at, last_login을 조회하도록 바꿔야했다.

2. 몰랐던 부분

  1. GROUP BY 개념
SELECT 
	user_id,
	SUM(total_amount)
FROM tbl_payment_history
WHERE status='true' 
GROUP BY user_id

3. 피드백

  1. 나는 해결해야할 문제에 대해서 접근했던 방식은

먼저 where절 조건(status='true')과 GROUP BY를 이용해 합연산(total)을 마친 user라는 조건에서 email과 계정생성날짜, 로그아웃 시간, email 보낸 횟수 등 여러 속성을 불러와야한다고 생각했었다.
하지만 팀원분이 코드를 짜실때 깨달았던 한가지는 먼저 필요한 데이터와 불필요한 데이터까지 포함된 모든 데이터를 불러온 다음, 조건을 통해 제외시키는 방법도 있다는 것을 알았다.

  • 이를 통해 깨달은 한가지는 문제해결을 위해서는 접근에 대한 발상의 전환을 유연하게 할 줄 알아야한다는 것이었다.
  1. 문제를 해결하면서 쿼리문의 실행 작동 순서와 작성순서(어디에 뭐가 먼저 오는지)까지 종합적으로 생각해보면서 어떻게 쓰는지만 알고 있었던 LEFT join과 Group by 개념까지 깊이 생각해볼 수 있었다.
  1. 한 1~2시간 가까이 고민하다가 어떻게 해야할지 발상이 떠오르지 않아 팀원분께 도움을 요청한뒤, 쿼리문을 작성해주셨다.
    하지만 항상 답을 알고보면 간단한 문제라서 나도 해결할 수 있는 문제였던 것 같아서 괜히 떠맡긴 기분이 들어 아쉬웠다.
profile
주의사항 : 최대한 정확하게 작성하려고 하지만, 틀릴내용이 있을 수도 있으니 유의!
post-custom-banner

0개의 댓글