[BookShop] 좋아요 API 구현 - count(), EXISTS

기본 LikesController.js

const conn = require('../mariadb'); //db 모듈
const {StatusCodes} = require('http-status-codes'); //status code 모듈

const addLike = (req, res) => {
    // 좋아요 추가
    const {id} = req.params; 
    const {user_id} = req.body; 

    let sql = "INSERT INTO likes(user_id, liked_book_id) VALUES (?, ?);";
    let values = [user_id, id];
    conn.query(sql, values, 
        (err, results) => {
            if(err) {
                console.log(err);
                return res.status(StatusCodes.BAD_REQUEST).end(); 
            }

            return res.status(StatusCodes.OK).json(results);
    })
}

const removeLike = (req, res) => {
    // 좋아요 삭제
    const {id} = req.params; 
    const {user_id} = req.body; 

    let sql = "DELETE FROM likes WHERE user_id = ? AND liked_book_id = ?";
    let values = [user_id, id];
    conn.query(sql, values, 
        (err, results) => {
            if(err) {
                console.log(err);
                return res.status(StatusCodes.BAD_REQUEST).end(); 
            }

            return res.status(StatusCodes.OK).json(results);
    })
}

module.exports = {
    addLike,
    removeLike
}

 

COUNT() 

: 행의 갯수를 세주는 집계 함수 

SELECT count(*) FROM likes WHERE liked_book_id=1

좋아요 테이블에서, liked_book_id = 1 인 행의 갯수를 count(*) 칼럼을 만들어서 출력해줌


서브쿼리

: 쿼리 안에 쿼리

SELECT *,
	값 AS 새로 추가할 컬럼명
    FROM 테이블;
SELECT *, 
    (SELECT count(*) FROM likes WHERE liked_book_id=books.id) AS likes 
    FROM books;

books 테이블안에서 liked_book_id = books.id인 행의 갯수를 넣은 likes칼럼을 만들고, 이를 books 뒤에 붙여줌

 


좋아요 개수가 포함된 books 테이블 조회 

books.js에 서브 쿼리 추가해주면, likes 컬럼도 같이 가져와줌

 

SELECT EXISTS

SELECT EXISTS (SELECT * FROM likes WHERE user_id=1 AND liked_book_id=1);

괄호 안에 SELECT값이 존재하는지 알려줌 -> 존재하면 1, 없으면 0 

개별 도서 조회 시 사용자가 좋아요를 했는지 여부를 포함 

SELECT *,
	(SELECT EXISTS (SELECT * FROM likes WHERE user_id=1 AND liked_book_id=1)) AS liked
    FROM books WHERE books.id=1;

 


최종 books 개별 도서 조회 시 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 category ON books.category_id = category.id
    WHERE books.id = ?;


⚠️ LEFT JOIN 시의 id 중복 -> 덮여쓰기 되어 출력됨

id가 두개이므로 category id인 0으로 결과가 나옴. 

category 테이블의 id 이름 변경해주자. 

SELECT *, 
    (SELECT count(*) FROM likes WHERE liked_book_id=books.id) AS likes 
    (SELECT EXISTS (SELECT * FROM likes WHERE user_id=1 AND liked_book_id=1)) AS liked
    FROM books
    LEFT JOIN category ON books.category_id = category.category_id
    WHERE books.id = 1;