LEFT JOIN + COUNT
같은 조인 결과를 두고도, 무엇을 세느냐에 따라 주문 수가 달라집니다
LEFT JOIN은 주문이 없는 사용자도 한 행으로 남깁니다. 차이는 그 행을 COUNT(*)가 그대로 세는지, 아니면 COUNT(o.order_id)NULL이라서 제외하는지에 있습니다.
공유된 시작점: LEFT JOIN 결과 행
박민수는 남아 있지만 주문 컬럼은 NULL
username
order_id
COUNT(*)
COUNT(o.order_id)
김철수
101
+1 행 자체를 셈
+1 주문값이 있음
김철수
102
+1 행 자체를 셈
+1 주문값이 있음
이영희
201
+1 행 자체를 셈
+1 주문값이 있음
박민수
NULL
+1 NULL 행도 포함
+0 NULL이라 제외
잘못된 방법
COUNT(*)
그룹 안에 보이는 행 수를 그대로 세므로, 매칭 주문이 없는 사용자도 1행이 남아 있으면 1이 됩니다.
김철수2
이영희1
박민수1
올바른 방법
COUNT(o.order_id)
오른쪽 테이블의 실제 주문값만 세므로, 매칭된 주문이 있을 때만 카운트가 증가합니다.
김철수2
이영희1
박민수0
핵심: LEFT JOIN 뒤에서 개수를 셀 때는 *가 아니라 오른쪽 테이블의 실제 컬럼을 지정해야, 매칭이 없는 NULL 행을 주문 수로 잘못 집계하지 않습니다.