발생 상황
최근 스터디가 생성된 책을 조회하기 위해 다음과 같은 쿼리를 작성했습니다.
SELECT DISTINCT book.* FROM book JOIN study s on book.id = s.book_id ORDER BY s.created_at desc limit 4;
해당 명령어를 사용시 중복제거가 되어 정상적인 동작을 할 것이라 예상하고 코드를 짜고 반환했습니다.
하지만 제가 원하는 것과는 달리 스터디 생성 순서로 책이 반환되는 것이 아닌 이상한 순서로 정렬되었고 이에 대해 원인을 찾아보게 되었습니다.
원인
가장 오래된 책들 중에서만 최신 순으로 정렬한다는 것을 알게 되었습니다.
DISTINCT가 먼저 중복을 다 제거하고 이 중에서 order by로 정렬이 되는 것이었고 저희가 원하는 바인 전체 책에서 최신에 스터디를 생성한 순으로 정렬이 안되는 상황이었습니다.
그래서 DISTINCT를 사용할 수 없는 상황이었고 다른 방안을 찾게 되었습니다.
해결 방법
먼저 중복을 제거하기 위해 group by절로 책 아이디를 묶고 이중에서 집계함수를 사용해서 가장 큰 날짜 값을 가진 함수를 검색했습니다. (가장 값이 크면 가장 최근이라는 뜻이기 때문 → 2015.05.23 < 2019.06.11)
이렇게 정렬하니 정상적으로 쿼리가 조회되는 것을 확인할 수 있었습니다.
SELECT *, max(s.created_at) FROM book JOIN study s on book.id = s.book_id GROUP BY s.book_id order by max(s.created_at) desc;