사고쳤어요
[도서 쇼핑몰] Node.js - 도서 조회 시 좋아요 개수, 여부 함께 보내주기 본문
https://makeaccident.tistory.com/159
[도서 쇼핑몰] Node.js - 도서 조회 관련 API 구현하기
도서 전체 조회 (카테고리, 신간 옵션)const books = (req, res) => { let categoryId = req.query.categoryid; let isNew = req.query.isnew; let sql = "SELECT * FROM books;"; // 전체 도서 조회 let values = []; if (categoryId && isNew) { // 카
makeaccident.tistory.com
기존 도서 전체 조회 코드에서는 데이터베이스의 books 테이블 값들을 보여주었다.
여기에 likes 테이블에서의 좋아요 개수를 모두 구해 같이 보여주도록 하자.
도서 좋아요 개수 추가
const books = (req, res) => {
let categoryId = req.query.categoryid;
let isNew = req.query.isnew;
let { limit, page } = req.query;
limit = parseInt(limit);
page = parseInt(page);
let sql = `SELECT *, (SELECT count(*) FROM likes WHERE books.id = liked_book_id) AS likes FROM books`; // 전체 도서 조회
let values = [];
if (categoryId && isNew) {
// 카테고리별 신간 도서 조회
sql += `WHERE category_id = ? AND
pub_date BETWEEN DATE_SUB(NOW(), INTERVAL 1 MONTH) AND NOW()`;
values = [categoryId, isNew];
} else if (categoryId) {
// 카테고리별 조회
sql += "WHERE category_id = ?";
values = [categoryId];
} else if (isNew) {
// 신간 조회
sql += `WHERE pub_date BETWEEN DATE_SUB(NOW(), INTERVAL 1 MONTH) AND NOW()`;
values = [isNew];
}
sql += ` LIMIT ${limit} OFFSET ${(page - 1) * limit};`;
conn.query(sql, values, (err, results) => {
if (err) {
return res.status(StatusCodes.BAD_REQUEST).json({
msg: `Error: ${err.code}`,
});
}
return res.status(StatusCodes.OK).json(results);
});
};
SELECT count(*) FROM likes WHERE books.id = liked_book_id 를 통해 좋아요 개수를 불러왔다.
그리고 불러온 값을 서브쿼리를 활용하여 기존 SELECT * FROM books 에서 * 뒤에 추가하였다.
사용자가 도서에 좋아요 눌렀는지 여부 추가
const bookDetail = (req, res) => {
let { id } = req.params;
let {userId} = req.body;
id = parseInt(id);
const values = [userId, id, id];
const sql = `SELECT * ,
(SELECT count(*) FROM likes WHERE liked_book_id = books.id) AS likes,
(SELECT EXISTS (SELECT * FROM likes WHERE user_id = ? AND liked_book_id = ?)) AS liked
FROM books LEFT JOIN categories
ON books.category_id = categories.id WHERE books.id=?;`;
conn.query(sql, values, (err, results) => {
if (err) {
return res.status(StatusCodes.BAD_REQUEST).json({
msg: `Error: ${err.code}`,
});
}
if (results[0]) {
return res.status(StatusCodes.OK).json(results[0]);
} else {
return res.status(StatusCodes.NOT_FOUND).end();
}
});
};
먼저 8번 줄에 있는 SELECT count(*) FROM likes WHERE liked_book_id = books.id) AS likes 는 위에서 보았던
도서의 좋아요 개수를 세 리턴하는 SQL문이다.
새롭게 추가된 것은 9번 줄의
(SELECT EXISTS (SELECT * FROM likes WHERE user_id=? AND liked_book_id = ?)) AS LIKED 이다.
위 서브쿼리는 SELECT * FROM likes WHERE user_id=? AND liked_book_id = ?
즉 유저 아이디 1인 사람이 1번 도서를 좋아하는지 여부가 존재할 경우 이를 리턴해주는 SQL문이다.
'웹 풀스택' 카테고리의 다른 글
[도서 쇼핑몰] Node.js - 주문 API 구현(mysql 비동기 처리) (0) | 2025.03.18 |
---|---|
[도서 쇼핑몰] Node.js - 장바구니 API 구현 (0) | 2025.03.17 |
[도서 쇼핑몰] Node.js - 좋아요 API 구현 (0) | 2025.03.14 |
[도서 쇼핑몰] Node.js - 도서 조회 페이지네이션 구현 (0) | 2025.03.13 |
[도서 쇼핑몰] Node.js - 도서 조회 관련 API 구현하기 (0) | 2025.03.13 |