AWS/MySQL

MySQL 영화 리뷰 서비스 개발

leopard4 2022. 12. 12. 14:08

 

 

 

use movie_test_db;

-- 1. 테이블 만들기 

-- 2. 더미 데이터 insert 했다고 가정하고 진행한다.

-- 3. 화면 기획서를 보고, 필요한 slq문을 작성.
--    중요! 순서 : 단일 테이블 처리 가능한 것부터 작성하고
--    메인 화면처럼, 여러 테이블 조인하는 것은 맨 나중에 작성한다.

-- 회원가입
insert into user ( email, password, nickname, gender)
values ( 'aksl@naver', '1234', '김닉네임', 1);

-- 영화명을 탭하면 리뷰 작성 화면
-- 100번 영화의 10번유저 리뷰 예시
insert into review ( movie_id, user_id,  content, rating)
values ( 100, 10 , "ㅋㅋ", 4);

-- 특정 영화의 리뷰 가져오는 sql
-- 영화 상세정보에서 이미 받은 타이틀 정보는 재활용 하는경우로 가정.
-- 리뷰 수정을 위해 보이진않게 하지만 r.id 정보를 보내준다.
select r.id , u.nickname, r.content, r.rating, r.created_at
from review r
join user u 
on r.user_id = u.id
where r.movie_id = 10
order by r.created_at desc
limit 0, 25 ;

-- 내정보 화면에서, 내 리뷰 리스트 가져오는 sql
select r.id, m.title, r.rating, r.created_at
from review r 
join movie m
on r.movie_id = m.id
where user_id = 1
order by r.created_at desc;

--  영화 상세 정보화면 ( 리뷰가 없을수도 있으니 left 조인을 해서 무비정보는 살려야한다.) date(m.year) 해서 시분초를 빼주면 더좋다.?
select m.*, ifnull(avg(r.rating) , 0 ) as avg_rating, ifnull( count(r.id), 0 ) as rivew_count
from movie m
left join review r
on m.id = r.movie_id
where m.id = 10 ;

-- 검색에 입력한 글자 저장 (히스토리)
insert into history ( user_id, word)
values (7 ,"mon");

-- 검색어가 포함된 영화의 목록을 가져오는 SQL
select m.title, count(r.user_id) as review_cnt, ifnull (avg(r.rating),0 ) as avg_rating 
from movie m
left join review r
on m.id = r.movie_id
group by m.id having title like "%h%";

-- 즐겨찾기 설정하는 SQL
insert into favorite (  movie_id, user_id)
values ( 5, 10);
-- 즐겨찾기 해제하는 SQL 
delete from favorite
where id = 5;

-- 즐겨찾기 설정된 영화목록을 가져오는 SQL f.id는 클라에서 관리하기위해 , m.id는 영화를 누르면 상세정보로 이동하기 위해 포함시킨다.
-- 클라에 보내줄때 이름을 알아보기 쉽게 변경해주어야한다.
select f.id as favorite_id, 
		m.title, 
		count(r.id) as review_cnt,
        ifnull( avg(r.rating), 0 )as rating_avg, 
		m.id as movie_id
from favorite f
join movie m
on f.movie_id = m.id
left join review r
on f.movie_id = r.movie_id
join user u
on f.user_id = u.id
where f.user_id = 10
group by f.movie_id
order by f.created_at desc;

-- 메인 화면구성 ( 리뷰갯수정렬 )
select m.id,
		m.title, 
		count(r.id) as review_cnt,
		avg(r.rating) as avg_rating, 
        if( f.id is null, 0 ,  1) as is_my_favorite
from movie m
left join review r 
on r.movie_id = m.id
left join favorite f
on m.id = f.movie_id and f.user_id = 10
group by m.id 
order by count(r.id) desc
limit 0, 25;

-- 메인 화면구성 ( 별점 평균 정렬)
select m.id,
		m.title, 
		count(r.id) as review_cnt,
		avg(r.rating) as avg_rating, 
        if( f.id is null, 0 ,  1) as is_my_favorite
from movie m
left join review r 
on r.movie_id = m.id
left join favorite f
on m.id = f.movie_id and f.user_id = 10
group by m.id 
order by avg_rating desc
limit 0, 25;