어제 DB 설계 후에 특정 데이터를 가지고 오는 연습을 하면서 처음으로 책에서 읽고 넘어간 JOIN을 써봤는데 ... details 페이지를 구현하다보니 movie 테이블에 있는 title, content, id뿐만 아니라 서브 테이블에 있는 genre와 actor, director에 대한 데이터텍스트도 가지고 와야했다.
연결이 되어있고 동일하게 movie_id 가 들어갔기 때문에 where의 조건은 WHERE movie_id
가 들어가게 짜야한다.
<select id="joinread" resultType="com.movieproject.domain.MovieVO">
SELECT g.genre, m.movie_title
FROM movie_genre mg
JOIN genre g ON mg.genre_id = g.genre_id
JOIN movie m ON mg.movie_id = m.movie_id
WHERE m.movie_id = #{movie_id}
</select>
mapper.xml에 이렇게 만들어보니 장르에 대한 정보만 가지고 올 수 있어서 감독과 출연진에 대한 정보도 모두 가지고 오기 위해....
SELECT g.genre, m.movie_title, a.actor_name, d.director_name
FROM movie_genre mg, movie_director md, movie_actor ma
JOIN genre g ON mg.genre_id = g.genre_id
JOIN movie m ON mg.movie_id = m.movie_id
JOIN actor a ON ma.actor_id = a.actor_id
JOIN movie m ON ma.movie_id = m.movie_id
JOIN director d ON md.director_id = d.director_id
JOIN movie m ON md.movie_id = m.movie_id
WHERE m.movie_id = 1;
조인을 무지성으로 사용하니까 동일한 테이블 'movie'를 세 번 참조하고, 각각의 별칭이 없는 문제로 오류가 발생했다... 다시 수정!
SELECT g.genre, m.movie_title, a.actor_name, d.director_name
FROM movie m
JOIN genre g ON mg.genre_id = g.genre_id
JOIN actor a ON ma.actor_id = a.actor_id
JOIN director d ON md.director_id = d.director_id
JOIN movie_genre mg ON m.movie_id = mg.movie_id
JOIN movie_actor ma ON m.movie_id = ma.movie_id
JOIN movie_director md ON m.movie_id = md.movie_id
WHERE m.movie_id = 1;
다시 변경을 하면서 서브 테이블과 연결 테이블이 뒤죽박죽으로 있으니까 불편해서 서브테이블 먼저, 연결 테이블을 예쁘게 순서대로 바꾸자 😍 ....... 때문에 오류가 발생했다.
- 테이블의 조인 순서 :
SQL 쿼리의 기본 구조는 테이블들을 조인하는 순서로 작동하는데 'FROM' 절에서 어떤 테이블과 어떤 테이블을 조인할지를 정의하고, 그 다음 'JOIN' 절에서 어떻게 조인할 것인지를 명시한다. 쿼리의 가독성을 높이기 위해 일반적으로 기준 테이블을 기준으로 다른 테이블들을 조인한다.
2. WHERE절 :
'WHERE'절은 조인된 결과로부터 특정한 조건을 적용하여 데이터를 필터링하는 역할을 하는데 이 절은 모든 조인 작업이 완료된 후에 실행이 된다. 즉 'FROM'절과 'JOIN'절을 통해 테이블을 합친 뒤, 그 결과에 조건을 적용한다...
쿼리에서 다른 테이블들을 조인하기 전에 기준이 되는 테이블을 먼저 선택하고, 그 테이블과 다른 테이블들을 조인한다. 그리고 'WHERE' 절을 사용하여 조인된 결과에 대한 필터링 조건을 추가해야한다...
그런데 나는 예쁘게 가독성이 편하자고 조인의 순서와 조건을 올바르게 설정하지 않았기 때문에 오류가 발생한 것이다.... 🤤
SELECT g.genre, m.movie_title, a.actor_name, d.director_name
FROM movie m
JOIN movie_genre mg ON m.movie_id = mg.movie_id
JOIN genre g ON mg.genre_id = g.genre_id
JOIN movie_actor ma ON m.movie_id = ma.movie_id
JOIN actor a ON ma.actor_id = a.actor_id
JOIN movie_director md ON m.movie_id = md.movie_id
JOIN director d ON md.director_id = d.director_id
WHERE m.movie_id = 1;
나만 알아볼 수 있을 것 같지만 빨-주-노-초-파-남-보 순서로
빨강 - movie의 movie_id와 movie_genre의 movie_id가 같으면 JOIN!
주황 - genre의 genre_id와 movie_genre의 genre_id가 같으면 JOIN!
...
....
.....
보라 - JOIN으로 잘 합쳐진 테이블에서 WHERE movie_id가 1인 데이터를 갖고와라!
가 완성이 된다!
이제 details 페이지를 완성하러 가보자!!!!