커뮤니티 기능을 만들어 보면서 커뮤니티를 제작&검색 할때 HashTag를 활용해 보기로 했다.
데이터 베이스는 아래와 같다.

커뮤니티를 만들때 해쉬테그를 만들거나 등록하고, 검색할수 있는 SQL을 구현해보았다.



처음엔 아래와 같이 짜 보았다.
SELECT c.*,
Group_concat(h.ht_name)
FROM cm c,
ht h
WHERE c.c_key = ANY (SELECT c_key
FROM tr
WHERE ht_id = (SELECT ht_id
FROM ht
WHERE ht_name = '귀여움주위'))
GROUP BY c_key;
HashTag를 검색했을때 관계테이블을 통해 포함하고있는 커뮤니티(c_key)를 Any를 통해 전부 받고
그룹 관련된 정보들과 Group_concat 을 통해 커뮤니티가 가지고 있는 HashTag를 하나의 String으로 반환하려 했다.
하지만 해당 코드의 결과는 이러했다.

ht 테이블에 대한 어떠한 관계도 지정해 주지 않아 ht테이블의 모든 데이터가 출력되는 현상이 발생했다.
c_key 가 지정되면 자동으로 관계테이블에 의해 ht 테이블에서 필터링해 출력 해줄거라는 내 착각이였다.
이에 join방식을 생각하게 되었고, 관련된 정보를 찾아보았다.
일반적인 join과 다르게 다대다 관계에서 관계테이블이 있는 경우 더욱 복잡해졌지만 left조인을 통해 해결 할 수 있었다.
SELECT c.*,
Group_concat(h.ht_name) AS hashTag
FROM cm c
LEFT JOIN tr t
ON c.c_key = t.c_key
LEFT JOIN ht h
ON t.ht_id = h.ht_id
WHERE c.c_key = ANY (SELECT c_key
FROM tr
WHERE ht_id = (SELECT ht_id
FROM ht
WHERE ht_name = '귀여움주위'))
GROUP BY c_key;
커뮤니티 테이블에 관계테이블을 left join하고 , 관계 테이블에 해쉬테그 테이블을 left join시키는 방식으로 해결했다.
이를 통해 c_key가 정해지면 처음 의도했던 대로 ht테이블이 관계테이블에 의해 필터링된 결과를 반환헀다.

이를 통해 HashTag를 통해 검색할수 있는 SQL을 완성할수 있었다.
'Spring & SpringBoot' 카테고리의 다른 글
| dsl 에 subquery 사용 경험 (0) | 2023.06.17 |
|---|---|
| JPA SQL 오류 경험 (0) | 2023.02.05 |
| Spring security 시작하기 (0) | 2023.01.20 |
| MockMVC (0) | 2023.01.13 |
| SpringBoot JPA 사용하기 (0) | 2022.12.30 |