조인과 스칼라 서브쿼리
로그인 (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;
좋아요 많은 순서대로 이미지를 불러올 수 있다!!!
'👩💻 BackEnd > 📊데이터베이스 [Database]' 카테고리의 다른 글
[일경험 / oracle] 프로시저 활용한 조회수 기능 구현 (0) | 2024.05.27 |
---|---|
[ SQL / DB ] ERD Cloud 작성하기 : 식별 관계와 비식별 관계, 관계차수 (0) | 2024.03.19 |
[SQLD] 데이터 모델링의 이해 (0) | 2023.10.17 |
[SQL] MySQL 쿼리문 연습 (0) | 2023.10.13 |
Oracle 테이블 간의 참조, 함수, 답변형 게시판 구조 (0) | 2023.08.01 |