SQL 쿼리는 MySQL을 기준으로 합니다.
게시글 목록 화면을 구현할 때 10개의 게시글에대한 각각의 댓글의 개수를 가져오고 싶었다. LEFT OUTER JOIN을 하고 COUNT만을 사용하게 되면, 다른 LEFT OUTER JOIN이 있을경우 올바른 댓글의 개수를 가져오지 못할 수 있다. 중복되는 comment.id가 존재할 수 있기 때문이다.
SELECT
COUNT(comment.id) AS commentCount
FROM board
LEFT OUTER JOIN comment ON board.id = comment.boardId
이렇게 오로지 comment만 LEFT OUTER JOIN을 사용한다면 문제없이 댓글의 개수를 가져올 수 있다. 그런데 만약에 다른 LEFT OUTER JOIN이 추가되어 댓글의 개수를 중복으로 가져온다면 어떻게 할까? 방법은 간단하다. DISTINCT 키워드를 사용하면 된다.
SELECT
COUNT(DISTINCT comment.id) AS commentCount
FROM board
LEFT OUTER JOIN comment ON board.id = comment.boardId
이 때 반드시 기억해야 할것이 있는데, 만약 comment.id에 NULL인 값이 들어있다면 이것도 개수를 셀까? 그렇지 않다. COUNT는 NULL인 값을 세지 않는다.
그럼 만약 NULL인 값도 세고 싶다면 어떻게 해야 할까? 여러 방법이 있는데 그 중 두가지 방법을 아래에 적어두었다.
COUNT(IFNULL(comment.id, -1))
COUNT(DISTINCT comment.id) + sum(comment.id is null)
첫 번째 방법은 null인값을 임의의 값으로 변경한 뒤 COUNT를 하는것이고, 두 번째 방법은 널인 값의 개수를 더하는 것이다. 이 외에도 다른 여러가지 방법이 있으니 아래 스택오버플로우 링크를 참고하자.