Search

54. 스프링부트 포토그램 구독정보 뷰 랜더링 조인과 스칼라 서브쿼리

구독 정보 뷰 랜더링

구독정보 관련해서 쿼리를 짜볼거다.
ssar로 로그인하고 cos의 프로필가서 구독자 정보를 가져올거다
-- 로그인(1 ssar) -- 구독정보(2 cos) -- 1번과 3번의 정보(toUserId)가 구독 모달에 출력 select * from Subscribe select * from user; select * from Subscribe where fromUserId = 2; SELECT * FROM User WHERE id = 1 OR id = 3 -- 조인 (user.id - subscribe.toUserId) SELECT * FROM User u INNER JOIN Subscribe s ON u.id = s.toUserId WHERE s.fromUserId = 2;
SQL
복사
INNER JOIN을 활용해서 2번 유저를 구독하는 구독자들을 뽑아온다
근데 모든 컬럼들이 필요한게 아니라서 필요한 컬럼들만 갖고 오게 수정해주자
-- 조인 (user.id - subscribe.toUserId) SELECT u.id, u.username, u.profileImageUrl FROM User u INNER JOIN Subscribe s ON u.id = s.toUserId WHERE s.fromUserId = 2;
SQL
복사
그리고 ssar이라는 유저(로그인한)가 cos를 구독한 유저들을 구독했는지 안했는지 여부가 필요하다.
-- 로그인(ssar 1), 화면 구독모달(ssar 1, love 3) SELECT TRUE FROM Subscribe WHERE fromUserId = 1 AND toUserId = 1; SELECT TRUE FROM Subscribe WHERE fromUserId = 1 AND toUserId = 3;
SQL
복사
ssar이 love를 구독하고 있기 때문에 true값인 1이 떨어진다.
가성 컬럼을 만들어서 거기다가 구독여부를 넣어주면 된다.
스칼라 서브쿼리를 이용해서 넣어주면되는데
스칼라 서브쿼리란 단일행이 리턴되야하면서 셀렉트문이 하나 더 들어간다
-- 스칼라 서브쿼리(단일행을 리턴) SELECT u.id, u.username, u.profileImageUrl, (select u.id) subscribeState FROM User u INNER JOIN Subscribe s ON u.id = s.toUserId WHERE s.fromUserId = 2;
SQL
복사
틀은 이렇게 짜주고 이제 제대로 구독여부 쿼리를 저기 스칼라 서브쿼리 안에 넣어준다
-- 구독 여부 완성 쿼리 SELECT u.id, u.username, u.profileImageUrl, (SELECT TRUE FROM Subscribe WHERE fromUserId = 1 AND toUserId = u.id) subscribeState FROM User u INNER JOIN Subscribe s ON u.id = s.toUserId WHERE s.fromUserId = 2;
SQL
복사
이제 로그인 유저랑 구독자 유저랑 동일인지 판단해야한다
-- 동일 유저인지 판단 여부 SELECT u.id, u.username, u.profileImageUrl, (SELECT TRUE FROM Subscribe WHERE fromUserId = 1 AND toUserId = u.id) subscribeState, 1 equalUserState FROM User u INNER JOIN Subscribe s ON u.id = s.toUserId WHERE s.fromUserId = 2;
SQL
복사
-- 동일 유저인지 판단 여부 SELECT u.id, u.username, u.profileImageUrl, (SELECT TRUE FROM Subscribe WHERE fromUserId = 1 AND toUserId = u.id) subscribeState, (1=u.id) equalUserState FROM User u INNER JOIN Subscribe s ON u.id = s.toUserId WHERE s.fromUserId = 2;
SQL
복사
select * from Subscribe; -- 구독수 select COUNT(*) from Subscribe where fromUserId = 3; -- 구독여부 (ssar(1)로 로그인, cos(2)페이지로 감) SELECT COUNT(*) from Subscribe where fromUserId = 1 and toUserId = 2; -- 로그인(1 ssar) -- 구독정보(2 cos) -- 1번과 3번의 정보(toUserId)가 구독 모달에 출력 select * from Subscribe select * from user; select * from Subscribe where fromUserId = 2; SELECT * FROM User WHERE id = 1 OR id = 3 -- 조인 (user.id - subscribe.toUserId) SELECT u.id, u.username, u.profileImageUrl FROM User u INNER JOIN Subscribe s ON u.id = s.toUserId WHERE s.fromUserId = 2; -- 로그인(ssar 1), 화면 구독모달(ssar 1, love 3) SELECT TRUE FROM Subscribe WHERE fromUserId = 1 AND toUserId = 1; SELECT TRUE FROM Subscribe WHERE fromUserId = 1 AND toUserId = 3; -- 가상 컬럼 추가 SELECT u.id, u.username, u.profileImageUrl , 1 subscribeState FROM User u INNER JOIN Subscribe s ON u.id = s.toUserId WHERE s.fromUserId = 2; -- 스칼라 서브쿼리(단일행을 리턴) SELECT u.id, u.username, u.profileImageUrl, (select u.id) subscribeState FROM User u INNER JOIN Subscribe s ON u.id = s.toUserId WHERE s.fromUserId = 2; -- 구독 여부 완성 쿼리 SELECT u.id, u.username, u.profileImageUrl, (SELECT TRUE FROM Subscribe WHERE fromUserId = 1 AND toUserId = u.id) subscribeState FROM User u INNER JOIN Subscribe s ON u.id = s.toUserId WHERE s.fromUserId = 2; -- 동일 유저인지 판단 여부 SELECT u.id, u.username, u.profileImageUrl, (SELECT TRUE FROM Subscribe WHERE fromUserId = 1 AND toUserId = u.id) subscribeState, (1=u.id) equalUserState FROM User u INNER JOIN Subscribe s ON u.id = s.toUserId WHERE s.fromUserId = 2;
SQL
복사

*참고