내가 해결 해야 되는 문제
- User 가 가진 Tag 를 3 개 이상 가진 Post 를 구해야함. (Post 에도 태그 등록 가능, 단 User 도 Post 도 최대로 등록할 수 있는 태그는 제한 되어 있음)
현재 가지고 있는 조건
- User, Post, Tag, PostTag, UserTag 로 총 5 개의 테이블 존재
- User 와 Post 는 1:N 관계
- User 와 Tag 는 M:N 관계 (UserTag 테이블 생성)
- Post 와 Tag 는 M:N 관계 (PostTag 테이블 생성)
1. User 가 가진 Tag 의 Id 와 Post 가 가진 Tag 의 Id 가 일단 같은 걸 찾아보자.
SELECT ph.PostId, ph.TagId FROM PostTag ph INNER JOIN UserTag uh ON ph.TagId = uh.TagId
WHERE uh.UserId = 1
ORDER BY ph.PostId;
PostId | TagId |
36 | 2 |
40 | 2 |
44 | 2 |
49 | 3 |
54 | 4 |
99 | 125 |
99 | 637 |
99 | 85 |
99 | 86 |
109 | 637 |
119 | 2 |
119 | 125 |
119 | 85 |
위와 같은 결과가 나왔을 때 1번 User 가 가지고 있는 Tag 를 3개 이상 가지고 있는 Post 는 99번 (4개), 119번 (3개) 인것을 알 수 있다.
2. 이제 PostId 를 기준으로 각각 가지고 있는 태그가 몇 개인지 구해보자. PostId 가 기준이 되므로 GROP BY 로 묶어주고 count 함수를 호출해 갯수를 구해준다.
SELECT ph.PostId, count(ph.PostId) as TagCount FROM PostTag ph INNER JOIN UserTag uh ON ph.TagId = uh.TagId
WHERE uh.UserId = 2
GROUP BY ph.PostId
ORDER BY ph.PostId;
결과는 아래와 같다.
PostId | TagCount |
36 | 1 |
40 | 1 |
44 | 1 |
49 | 1 |
54 | 1 |
99 | 4 |
109 | 1 |
119 | 3 |
3. 마지막으로 TagCount 가 3 개 이상인 PostId 를 구해주면 된다. TagCount >= 3 을 WHERE 절에는 추가 해 줄 수가 없으므로 HAVING 을 사용해 추가해 준다.
SELECT ph.PostId, count(ph.PostId) as TagCount FROM PostTag ph INNER JOIN UserTag uh ON ph.TagId = uh.TagId
WHERE uh.UserId = 2
GROUP BY ph.PostId
HAVING TagCount >= 3
ORDER BY ph.PostId;
결과는 다음과 같다.
PostId | TagCount |
99 | 4 |
119 | 3 |
'Development > MySQL' 카테고리의 다른 글
CHAR 와 VARCHAR 차이 (0) | 2022.03.11 |
---|---|
MySQL 기간에 따른 데이터 가져오기 (ex 3 개월 전, 일주일 전, 하루 전) (0) | 2021.01.08 |
최근댓글