사건의 발단
전체 도서 조회할 때 쿼리로 뭘 기준으로 정렬할 건지 입력받아서 정렬하려고 했다. 입력 가능한 기준은 최근 출판일 순, 좋아요 순, 판매량 순이다.
사건
워크벤치에서 아래 코드 실행하면 잘만 굴러간다.
SELECT *,
(SELECT COUNT(*) FROM likes WHERE liked_book_id = books.id) AS likes,
(SELECT COUNT(*) FROM orderedBook WHERE orderedBook.book_id = books.id) AS orders
FROM books
ORDER BY pub_date DESC
LIMIT 4 OFFSET 0;
근데 포스트맨으로 요청 날리고 응답으로 날아오는 결과 보면 정렬이 정말 전혀 안되어있다. 그냥 책 id 순서대로 보내준다.
고난
구글 뒤져보니까 ORDER BY랑 LIMIT 같이 쓰려면 아래와 같이 쓰라고 하더라.
SELECT *
FROM (SELECT * FROM tbl1) tbl2
ORDER BY tbl2.id
LIMIT 4 OFFSET 0;
그래서 저렇게 썼는데 아래와 같은 에러가 났다. 온갖 짓을 다 해도 안되길래 그냥 깔끔하게 포기하려고 했다.
SELECT all_books.*
FROM (SELECT *,
(SELECT COUNT(*) FROM likes WHERE liked_book_id = books.id) AS likes,
(SELECT COUNT(*) FROM orderedBook WHERE orderedBook.book_id = books.id) AS orders
FROM books) all_books
ORDER BY all_books.likes DESC;
해결
오류 메시지 제대로 안읽고 왜 워크벤치에서는 잘 되는데 vscode에서는 이 모양인지 괜히 애꿎은 변수명이나 바꾸고 있었는데
아니 거기에 따옴표가 왜 들어가니
그래서 리터럴 문자로 넣었더니 정상적으로 돌아간다~
let sql = `SELECT all_books.*
FROM (SELECT *,
(SELECT COUNT(*) FROM likes WHERE liked_book_id = books.id) AS likes,
(SELECT COUNT(*) FROM orderedBook WHERE orderedBook.book_id = books.id) AS orders
FROM books) all_books `;
// ...
if (sort) { // likes, orders, pub_date
sql += `ORDER BY all_books.${sort} DESC `;
}
// ...
'데브코스' 카테고리의 다른 글
[9주차 - DAY3] 코드 퀄리티 & 랜덤 데이터 API (0) | 2024.04.24 |
---|---|
[9주차 - DAY2] jwt 확인과 pagination (0) | 2024.04.23 |
[9주차 - DAY1] jwt와 에러 처리 (0) | 2024.04.22 |
[8주차 - DAY5] 주문 API 구현 (0) | 2024.04.19 |
[8주차 복습 발표] 비동기 처리 (1) | 2024.04.18 |