쌓고 쌓다
LEFT JOIN 행 개수 주의점 본문
특정 게시글에 달린 댓글 개수와 좋아요 개수를 구하는 쿼리를 작성하고자 했다.
먼저 poster_id가 61인 게시글에 달린 댓글들을 보자.
댓글 id가 25, 26, 34번으로 3개의 댓글이 존재한다.
여기서 게시글과 댓글을 LEFT JOIN하여 결과를 보자.
select * from poster LEFT JOIN comment ON poster.id = comment.poster_id;
게시글 정보와 댓글 정보가 붙어 출력된다.
그럼 게시글에 달린 댓글 개수를 세보자.
select poster.id, COUNT(comment.id) from poster LEFT JOIN comment ON poster.id = comment.poster_id GROUP BY poster.id;
61번 게시글에 달린 댓글 개수는 3개로 정상적으로 나온다.
그러나 문제는 여기서 발생했다.
한번 더 LEFT JOIN으로 좋아요 테이블과 조인 했다.
select poster.id, COUNT(comment.id), COUNT(poster_like.id) from poster LEFT JOIN comment ON poster.id = comment.poster_id LEFT JOIN poster_like ON poster.id = poster_like.poster_id GROUP BY poster.id;
갑자기 61번 게시글의 댓글 개수가 6개로 나온다.
LEFT JOIN으로 왼쪽 테이블의 행 개수는 그대로일거라 생각해서 발생한 문제이다.
게시글과 댓글을 LEFT JOIN한다면
하나의 게시글에 2개의 댓글이 달린 상태라면 결과 테이블에 행의 개수는 2개가 된다.
위의 결과 테이블은 현재 2개의 행이 있는데
이 상태에서 또 좋아요 테이블과 LEFT JOIN하여 문제가 발생한 것이다.
해당 게시글에 좋아요가 3개가 존재하는 상태라면
결과 테이블에 존재하는 2개의 행과 좋아요 테이블에 존재하는 3개의 행이 조인하여
2X3으로 6의 결과가 나오게 된다.
LEFT JOIN할때 행의 개수가 일정하지 않다는것에 주의하자.
'프로그래밍 > SQL' 카테고리의 다른 글
Docker로 서버 동작하기 / MySQL 외부 접속, 아이피 허용 (0) | 2024.04.12 |
---|---|
[MySQL] DISTINCT와 ORDER BY 사용시 ORDER BY clause is not in SELECT list (0) | 2024.04.09 |
[MySQL] Count(*), Count(1), Count(Column) (1) | 2024.02.12 |
[MySQL] TEXT VARCHAR 차이? (0) | 2023.12.27 |
오라클 중심의 SQL 배움터 13장, 16장 연습문제 풀이 (0) | 2022.12.15 |
Comments