내가 해결 해야 되는 문제

  • 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

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기