[Project] DB 쿼리문 필요할 것 같은 것 찾기

김호정's avatar
Oct 09, 2024
[Project] DB 쿼리문 필요할 것 같은 것 찾기
  1. 지역 ssr로 뿌리기 위한 DB
select city from region_tb
notion image
  1. 지역 선택하면 영화관 나올 수 있는 DB쿼리문
SELECT rt.city, ct.name FROM REGION_TB rt INNER JOIN cinema_tb ct ON rt.id = ct.region_id WHERE rt.id = 2;
notion image
  1. 영화나올 수 있게
    1. 일단 영화, 쇼타임 조인 → 영화 id로 이름, 등급, 스크린 번호, 시작시간 찾기
    2. select distinct mt.movie_nm, mt.rating_grade, st.screen_id, st.started_at from showtime_tb st inner join movie_tb mt on st.movie_id = mt.id where mt.id=1
      notion image
       
      2번째 영화 선택 시
      notion image
b. 상영관 아이디로 영화 찾는법
  1. 상영관이 1일 때 영화들
SELECT * FROM showtime_tb st LEFT OUTER JOIN screen_tb stb ON st.screen_id = stb.id LEFT OUTER JOIN movie_tb m ON st.movie_id = m.id WHERE stb.id = 1;
notion image
c. 영화관 id로 영화 찾는 법
  1. 영화관 id = 1일 때 상영관들
select * from cinema_tb ct inner join screen_tb st on ct.id = st.cinema_id where ct.id = 1
notion image
영화관 1일 때 상영관 번호만 찾기
select st.id from cinema_tb ct inner join screen_tb st on ct.id = st.cinema_id where ct.id = 1
notion image
 
  1. 스크린 1일 때 쇼타임 합친 것
SELECT * FROM showtime_tb st LEFT OUTER JOIN screen_tb stb ON st.screen_id = stb.id WHERE stb.id = 1;
notion image
 
  1. 영화관 1 일 때 영화들
SELECT DISTINCT m.* FROM showtime_tb st LEFT OUTER JOIN screen_tb stb ON st.screen_id = stb.id LEFT OUTER JOIN cinema_tb ctb ON stb.cinema_id = ctb.id LEFT OUTER JOIN movie_tb m ON st.movie_id = m.id WHERE ctb.id = 1;
notion image
 
영화 + 쇼타임
select * from showtime_tb st left outer join movie_tb mt on st.movie_id = mt.id
notion image
 

생각 변환

지역 누르면 영화관, 영화관 누르면 영화 지역 아이디만 알면 모든 것을 아는 것이 아닌
나눠서 생각해 보자!!
 
  1. 지역id선택시 영화관 나올 수 있게
  1. 영화관 id선택시 영화 나올 수 있게(이 부분이 제일 어려웠다. 너무 멀리 있는 정보를 받아와야 했기에)
  1. 영화 선택 시 날짜가 나오는데 고민이 있었다. 일단 js로 오늘 날짜 + 5 하는 걸로 결정
    1. 그냥 누르면 서버하고 연결 안하고 js로 오늘 날짜 + 5일을 그냥 올릴건지
    2. 영화 선택 시 상영시간이 있는 날짜만 나오게 할 것인지(이게 좋은게 상영시간 없는 날짜가 굳이 보일 필요가 없다 생각했다. 클릭해도 없는 날이면 안보이는게 좋지 않은가?)
  1. 날짜 선택 시 해당 영화와 해당 날짜에 맞는 상영시간 보여주기
  1. 상영시간 선택 시 확인 버튼이 나오고
  1. 확인 버튼 누르면 세션으로 seat페이지로 보내기
 
 
  • 영화, 쇼타임 합치고 스크린 1236일 때 조회
SELECT * FROM showtime_tb st LEFT OUTER JOIN movie_tb mt ON st.movie_id = mt.id WHERE mt.id IN (1, 2, 3, 6);
 
  • 영화, 쇼타임 합치고 스크린 영화관 아이디 1 일 때 조회
SELECT * FROM showtime_tb st LEFT OUTER JOIN movie_tb mt ON st.movie_id = mt.id WHERE mt.id IN (select st.id from cinema_tb ct inner join screen_tb st on ct.id = st.cinema_id where ct.id = 1);
 
  • 이거 JPQL
SELECT st FROM Showtime st LEFT JOIN st.movie mt WHERE mt.id IN ( SELECT s.id FROM Cinema c JOIN c.screens s WHERE c.id = :cinemaId )
영화관 1일 때 영화 이름, 수위
SELECT distinct mt.movie_nm, mt.rating_grade FROM showtime_tb st LEFT OUTER JOIN movie_tb mt ON st.movie_id = mt.id WHERE mt.id IN (select st.id from cinema_tb ct inner join screen_tb st on ct.id = st.cinema_id where ct.id = 1);
 
문제가 있었다!
IN쿼리 안에
select st.id from cinema_tb ct inner join screen_tb st on ct.id = st.cinema_id where ct.id = 1
이 쿼리의 결과를 넣어야 하는데 넣으려고 하니까 못넣겠음..
 
 

날짜를 선택해서 구할 수 있는 방법

sql
SELECT * FROM SHOWTIME_TB WHERE DAY(started_at) = 12;
JPQL
SELECT s FROM Showtime s WHERE FUNCTION('DAY', s.startedAt) = 12
또 신경써야 할 게 있다 영화 id로도 확인해야한다!
 
sql
SELECT * FROM SHOWTIME_TB WHERE DAY(started_at) = 23 AND movie_id = 1;
JPQL
SELECT s FROM Showtime s WHERE FUNCTION('DAY', s.startedAt) = 23 AND s.movieId = :movieId
 
 
Share article

keepgoing