-
group by count 0 적용 count ifnull 안됨Backend/DB 2022. 11. 7. 14:28
# Mysql 에서 join 후 group by 시에 null값 혹은 0 값은 나오지 않을때
# group by count 0 적용 count ifnull 안됨
select count(e.ESSAY_ID) as totalCount from score s, essay e where s.ESSAY_ID = e.ESSAY_ID and e.user_id = :user_id group by e.user_id;
user_id로 group by한 다음에 count를 해주는 쿼리이다.
이 때, user_id로 그룹핑 해주었을 때 row값이 하나도 없으면 상식적으로는 0을 뱉을거라 생각했지만
그렇지 않았다.
그렇다고 count(ifnull(e.ESSAY_ID, 0))를 한다고 0이 나오지도 않았다.
score <-> essay 조인 테이블은 scored_essay를 찾는 테이블인데 애초에 이 테이블에 검색하려는 user_id가 하나도 채점된 에세이가 없으면, score <-> essay 조인 테이블에 user_id로 검색되는 게 없을 것이니 group by를 하려고 해도 아무것도 없는 게 당연하다.
조금 찾아보니 count 집계 함수는 null을 포함하여 세지 않는다.
이것을 역으로 이용하면 조회하려는 목록을 바꿔서, user와 <-> scored_essay를 join해서 null을 포함하여 카운팅하면 된다.
select count(*) as totalCount from essay_user eu left join (select e.ESSAY_ID, e.USER_ID from score s, essay e where s.ESSAY_ID = e.ESSAY_ID) as se on eu.USER_ID = se.user_id where se.USER_ID = :user_id
처음에 어떻게든 group by만을 활용하여 쿼리를 짜려했지만, group by의 key값으로 조회할 수 없는 테이블이 생긴다면
left join을 활용하면 충분히 원하는 값을 가져올 수 있다.
어쨋든 돌고돌아 어렵게 접근했지만 매우 간단하게 쿼리를 쓰는 방법도 있다.
select count(*) from score, essay where essay.USER_ID = :user_id and essay.ESSAY_ID = score.ESSAY_ID;
매우..매우..깔끔하다.
처음에 group by에 집착하여 left join까지 오게 됐지만
group by를 쓸 때 고려해야 하는 점을 잘 생각해봐야겠다고 느꼈고 언제 left join을 하면 되는지도 배우게 됐다.
그리고.. 저 바로 위의 간단한 코드를 보며 든 생각이.. 저정도면 쿼리 메쏘드로 쓸 수 있지 않을까?
정답은 Yes다.
바로 위 코드를 JPQL 쿼리 메쏘드로 옮기면 아래와 같다.
long countByEssay_UserId(String user_id);
Essay entity는 실제로 Score Entity와 1:1 join column으로 명시되어 있으므로 아래와 같이 사용하면 네이티브 쿼리 없이 쓸 수 있다.
countBy Join되어있는 엔티티 _ 컬럼명
주의할 점은, count의 output의 타입은 long 타입을 반환한다는 점만 알면 된다.
'Backend > DB' 카테고리의 다른 글
Redis (0) 2022.12.19 정규화 (제 1정규화 ~ 제 3정규화) (0) 2022.11.14 having vs where 차이점 (0) 2022.10.04 left join, right join, inner join, full outer join, self join, cross join (0) 2022.09.30 MySQL Table 생성 및 컬럼 추가 예제 (0) 2022.09.26