[LeetCode - Medium] Market Analysis I ( 테이블 조인 조건 ON 절에 “AND” 사용하기 )

LeetCode 1158. A great example for 'and' in join condition

Problem

Difficulty : Medium

Write an SQL query to find for each user, the join date and the number of orders they made as a buyer in 2019.

My Solutions

-- OUTPUT : buyer_id  | join_date  | orders_in_2019 |
SELECT 
    user_id AS `buyer_id`,
    join_date,
    -- the number of orders 
    COUNT(DISTINCT order_id) AS `orders_in_2019`
FROM Users u
-- LEFT JOIN : SHOULD CONTAIN ALL DATA FROM Users
LEFT JOIN Orders o
    ON o.buyer_id = u.user_id 
        -- ONLY orders they made as a buyer in 2019
        AND YEAR(order_date) = 2019 
GROUP BY 1, 2

Lessons Learned

문제에 유일한 조건“ONLY orders they made as a buyer in 2019” 을 쿼리로 간단히 작성하는 법을 정리한다.

쿼리실행순서 FROM > JOIN > WHERE

FROM Users u
LEFT JOIN Orders o ON o.buyer_id = u.user_id 
WHERE YEAR(order_date) = 2019 

WHERE YEAR(order_date) = 2019

  • 쿼리 실행순서 FROM > JOIN > WHERE 순이다.
  • 조인 후 실행되는 WHERE절 조건으로 인해, 2019년에 주문건이 없는 고객 데이터는 제거된다. 2019년에 주문건이 없는 유저라도 집계해서 0으로 출력해야하므로 WHERE 절에 조건을 추가하면 안된다.

조인 조건문에 AND 로 조건문 추가하기

FROM Users u
LEFT JOIN Orders o ON o.buyer_id = u.user_id 
        AND YEAR(order_date) = 2019 

LEFT JOIN Orders o ON o.buyer_id = u.user_id AND YEAR(order_date) = 2019

  • ON o.buyer_id = u.user_id
    • Users 테이블에 Orders 테이블을 LEFT JOIN 을 함에 있어 조인 키를 설정한다.
  • AND YEAR(order_date) = 2019
    • 조인키 조건에 이어서, Orders 테이블에서 2019년 주문 데이터만 불러오는 조건을 추가한다.