TIL DAY 41 || SQL JOIN + GROUP BY Practice

TK·2021년 4월 22일
1

TIL

목록 보기
47/55

1차 프로젝트 때 Django orm 쿼리를 실제 SQL 쿼리로 바꿔보면서
inner join, outer join 을 언제 써야 하는지에 대해 익혀보게 되는 계기가 되었다.

Problem

장바구니에 물건이 8개보다 많은 유저의 이름을 구해보자

테이블은 다음과 같이 구성돼있다.

carts

orders

order_status

users

  • 우선 carts 테이블에 들어있는 order_id 건에 대해서
  • order_status 의 status 가 "구매전"인 order 의 order_id 만 가져와야한다.
SELECT * a.id
FROM orders a INNER JOIN order_status b
                      ON a.order_status_id = b.id
WHERE b.status = "구매전";
  • 가져온 order_id 가 있는 테이블과 carts 테이블을 inner join 한다. (left join 해도 상관없음)

  • 그 뒤 order_id 로 group by 한 뒤 sum(carts.quantity) 가 8 보다 큰 order_id 만 뽑아온다.

SELECT b.order_id
FROM (SELECT * a.id
      FROM orders a INNER JOIN order_status b
                            ON a.order_status_id = b.id
      WHERE b.status = "구매전") a INNER JOIN carts b
					  ON a.id = b.order_id
      GROUP BY order_id
      HAVING SUM(b.quantity) > 8;
  • 8 보다 큰 order_id 가 있는 테이블과 orders 테이블을 join 하고, join 된 테이블에서 또 users 테이블을 join 한 뒤 users.name 만 SELECT 해주면 끝!
SELECT c.name
FROM (SELECT b.order_id
FROM (SELECT * a.id
      FROM orders a INNER JOIN order_status b
                            ON a.order_status_id = b.id
      WHERE b.status = "구매전") a INNER JOIN carts b
					  ON a.id = b.order_id
      GROUP BY order_id
      HAVING SUM(b.quantity) > 8) a INNER JOIN orders b
                                            ON a.order_id = b.id
                                    INNER JOIN users c
                                            ON b.user_id = c.id;

profile
Backend Developer

0개의 댓글