ERD, likes 테이블 생성
Table likes{
user_id integer
liked_book_id integer
}
Ref: likes.user_id > users.id
Ref: likes.liked_book_id > books.id
외래키 엮어서 테이블 생성
좋아요 추가
누가 좋아요 눌렀는지? 로그인 한 상태 확인 > 토큰값
로그인 할때 받은 token > header *Authorization* : payload 값을 읽을 수 있다 > 사용자의 id를 읽을 수 있다.
INSERT INTO likes (user_id, liked_book_id) VALUES (1, 1);
const addLike = (req, res) => {
const { id } = req.params; //book_id
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);
});
};
좋아요 취소, 삭제
user_id, liked_book_id 둘다 고려해야 한다.
const removeLike = (req, res) => {
const { id } = req.params; //book_id
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);
});
};
좋아요 고도화
좋아요 개수를 books(users) 테이블 각각의 책에 저장하는게 아닌,
count() 로 likes 테이블의 행의 개수를 계산한다.
pk 가 없으면 workbench에서 제한해서 update,delete Read Only 로 뜬다.
세팅 `Workbench Preferences` > SQL Editor > Other : Safe Updates 체크 해제
SELECT count(*) FROM Bookshop.likes WHERE liked_book_id = 1;
서브쿼리 sub
조인 안한 상태에서 books 테이블에 좋아요수 전달하기?!
SELECT *, (SELECT count(*) FROM Bookshop.likes WHERE liked_book_id = books.id) as likes FROM books ;
1. 도서 테이블 전체 조회
- SELECT * FROM books ;
- SELECT 컬럼명1, 컬럼명2,,,, FROM 테이블명;
2. 도서 테이블 전체 조회 + 컬럼 1개 추가하기
- SELECT *, 값 AS 새로 추가할 컬럼명
FROM books ; - SELECT *, (각 행마다 likes 테이블에 liked_book_id로 가지고 있는 행 수) AS likes
FROM books ; - SELECT *, (SELECT count(*) FROM likes WHERE liked_book_id = books.id) AS likes
FROM books ;
서브쿼리 : 쿼리 안에 쿼리
메인쿼리 : books와 관련된 외부 쿼리
count() : 행 개수
AS : 컬럼 별칭
내가 좋아요 했는지 체크? > 개별 도서 조회
구현
좋아요수? 전체 도서 조회 코드에 sql 문 수정해주기
let sql = `SELECT *,
(SELECT count(*) FROM Bookshop.likes WHERE liked_book_id = books.id) as likes
FROM books`;
개별 도서 조회
select > likes
select > liked
left join > category
let sql = `SELECT *
, (SELECT count(*) FROM Bookshop.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.id
WHERE books.id=?;
`;
book_id 는 1인데, 0으로 표시된다.
카테고리 id 는 0 부터 시작하고, 조인했기 때문이다!
뒤에 나온 0으로 덮어씌워진다.
컬럼명을 작성해서 선택적으로 가져오던가 // view문법 drop 사용하던가 // category_id 이름을 변경한다.
☑️ 배운 점
서브쿼리, LEFT JOIN 구현하는법