며칠 동안 고민하고 고민하고 또 고민했던 MySQL 과제 1-4번을 드디어 해결했다!
고민했던 부분과 새롭게 알게된 내용들을 정리해보고자 한다.
<문제>
“Rebekah”라는 이름을 가진 사용자가 좋아요하고 있는 게시물 중에서 “무엇인가?”라는 단어가 포함된 게시물만 출력해주세요. 추가로 게시물을 작성한 사람과 게시물을 좋아요 하는 사람을 author와 like_user라는 컬럼명으로 만들어서 출력해주세요.
이 문제는 posts, likes, users 세 개의 테이블을 가지고 해결을 하는 문제였다.
가장 큰 이슈는 해당 글의 좋아요를 한 사람의 이름(레베카!!!)을 가져오는 것이었고, 이때 users 테이블의 name 컬럼을 두 번 가져와야 해서 어려웠다.
고민을 하다 보니 아예 JOIN의 종류가 틀린 건지부터 내가 모르고 있는 다른 규칙이 있는 건지 등등 해결해야 할 문제를 벗어나 더 넓게 고민을 하다 보니 해결하는 데 시간이 더 오래 걸린 것 같다.
열심히 고민하고 구글링한 결과, 생각보다(?) 단순했던 해결법을 찾았고 몇 번의 시도 끝에 성공했다.
아래는 내가 작성한 코드이다.
SELECT likes.post_id AS id,
posts.title,
posts.content,
author.name AS author,
likeuser.name AS like_user
FROM likes
INNER JOIN posts ON posts.id = likes.post_id
INNER JOIN users AS author ON author.id = posts.user_id
INNER JOIN users AS likeuser ON likeuser.id = likes.user_id
WHERE posts.content LIKE "%무엇인가?%"
AND likeuser.name = "Rebekah";
주요 내용은 아래와 같다.
똑같은 column을 가져와야 할 때는 AS를 활용, 해당 열에 가명(alias)을 사용한다. AS는 보여지는 열의 이름을 바꿀 때만이 아니라 2개의 열을 가져올 때 각각을 다른 이름으로 참조할 수 있도록 하는 역할도 한다.
(users 테이블을 INNER JOIN 할 때 각각 다른 이름으로 사용했다.)
단순한 문법이지만 헷갈렸던 부분인데, WHERE 뒤의 조건은 AND로 연결한다.
결과적으로 3개의 테이블(likes, posts, users)을 가지고, 3번의 INNER JOIN을 하면서 2개의 WHERE 문을 사용했다.
그래서 과제가 해결이 되지 않아도 자바스크립트 코딩보다는 뭔가 될 것 같기도 하고, 답답한 느낌도 덜 했던 것 같다.
그리고 해결했을 때의 기쁨도 더 컸다!
앞으로도 이 느낌을 기억하면서 포기하지 않는게 중요할 것 같다.