본문 바로가기

👩‍💻 BackEnd/📊데이터베이스 [Database]

[ SQL / DB ] 쿼리 저장소

 

 

조인과 스칼라 서브쿼리 

로그인 (1 ssar) -- 구독 정보(2 cos)

1번과 3번의 정보가 구독 모달에 출력 

(준비중...) 

 

 

서브 쿼리 (내용이 다소 길고, 조금 헤메는 과정이 있음) 

조건 : 좋아요가 많이 눌린 게시물 가져오기 

## id 가 2,3 인 사진의 정보를 불러오기 
SELECT * FROM image WHERE id IN (2,3);

 

## likes 테이블에서 imageId를 중복 없이 가져오기 
## likes 테이블에 있는 imageId라면 좋아요가 눌린 게시물이기 때문이다. 
SELECT distinct imageId FROM likes;

 

첫번째 쿼리의 WHERE 절에 id 값을 두번째 쿼리로 준다면 

 

좋아요가 눌린 게시물 정보 불러오기가 가능해진다. 

 

하지만 중복을 제거하여 가져오는 것은 어느 사진이 많은 좋아요 개수를 받았는지 알 수 없기에 좋은 방법이 아니다. 

 

따라서 GROUP BY 절을 사용하여  imageId 를 묶고, 

COUNT 함수로 값을 카운트 해주는 것이 좋다. 

SELECT imageId, count(*) likeCount 
FROM likes 
GROUP BY imageId  
ORDER BY likeCount DESC;

 

SELECT * 
FROM image 
WHERE id  in (
	SELECT imageId FROM 
    	(SELECT imageId, count(*) likeCount  
         FROM likes 
         GROUP BY imageId 
         ORDER BY likeCount) inline_view_table);

 

 

음... 하지만 정렬이 되지 않는다... 

왜일까? 

 

원인 

IN 연산자 다음에 오는 쿼리는 정렬이 아닌 결과값만 그대로 가져올 뿐 정렬이 된 결과를 가져온지 않는다고 한다. 

즉, IN 연산자 다음에는 정렬을 해도 정렬되지 않는다! 

(뭔가 SQLD 자격증 공부할 때 배웠던 것 같은 기억이...ㅎ)

 

해결방법

 

JOIN 방법을 사용해보자

아래의 두개의 테이블을 조인해보자. 

 

이 두개의 테이블을 JOIN 해보자. 

 

select * from image i inner join (select imageId , count(imageId) likeCount from likes group by imageId) c on i.id = c.imageId;

 

id 와 imageId 를 조인의 조건으로 설정하여 JOIN 연산 

 

 

하지만 아직 좋아요 수가 많은 순으로 정렬되지 않았다. 

 

뒷 부분에 ORDER BY 를 사용해서 좋아요 순이 많은 순대로 정렬을 해준 뒤 

 

SELECT 컬럼을 image 테이블에 있는 모든 것만 불러오도록 쿼리를 다음과 같이 수정하면 

 

 select i.* from image i inner  join (select imageId ,  count(imageId) likeCount  from likes  group by imageId) c on i.id = c.imageId order by likeCount desc;

 

좋아요 많은 순서대로 이미지를 불러올 수 있다!!!