-
2019-08-27 개발일지개발일지 2019. 8. 27. 14:30
오늘은 쿼리관려해서 문제 하나가 오전부터 오후 2시까지 시간을 잡아먹었다. ㅡ"ㅡ
기존 공지사항 기능에 댓글이 없었는데 댓글이 추가되는 바람에 댓글 테이블을 설계했고, 기존 목록을 조회하는 쿼리를 수정하는 과정에서 문제가 발생했다.
글 제목 (댓글 카운트 수) 이런식으로 제목을 뽑으려고 시퀄라이즈 쿼리 옵션을 이리저리 수정하고 있었는데 쿼리가 계속 래핑되어 수행이 되서 말썽이었다.
BoardModel.findAndCountAll({ attributes: [ [ sequelize.fn('COUNT', sequelize.col('board_comments.id')), 'commentCount' ] ], include: [ { model: BoardCommentModel, attributes: [] } ], });
대략 이런 쿼리였는데, 내가 예상했던 조회 쿼리는 아래와 같다.
SELECT board.id, COUNT(board_comments.id) AS commentCount FROM board INNER JOIN board_comments ON board.id = board_comments."boardId"
근데 얘가 아래처럼 실행 되더라.
SELECT board.* FROM (SELECT board.id, COUNT(board_comments.id) AS commentCount FROM board) INNER JOIN board_comments ON board.id = board_comments."boardId"
이러니 래핑 쿼리 안에 있는 COUNT()함수 내의 테이블(board_comments)를 찾을 수가 없어서 자꾸 쿼리 오류가 났다.
로우 쿼리를 작성해서 하기엔 자존심도 상하고 분명 컨트롤 할 수 있는 방법이 있을거라 생각해서 이리저리 찾아보다가 도움을 요청했고 답변을 받아 결국 해결방안을 찾았다.
결국 위와 같이 래핑하는 방식도 서브쿼리인 것이고, subQuery 옵션을 false로 설정하면 해결되는 것이었다.
BoardModel.findAndCountAll({ subQuery: false, attributes: [ [ sequelize.fn('COUNT', sequelize.col('board_comments.id')), 'commentCount' ] ], include: [ { model: BoardCommentModel, attributes: [] } ], });
'개발일지' 카테고리의 다른 글
2019-08-29 개발일지 (0) 2019.08.29 2019-08-28 개발일지 (0) 2019.08.28 2019-08-26 개발일지 (0) 2019.08.26 2019-08-23 개발일지 (0) 2019.08.23 2019-08-22 개발일지 (0) 2019.08.22