동영상 좋아요 리스트 불러오기 0 3 1,455

by 김성진 [MySQL] 좋아요 검색 리스트 [2022.03.21 16:23:39]


스타일1.PNG (49,006Bytes)

   

 

안녕하세요 선배님들 현재 동영상에 대한 좋아요 기능을 하고있는데 궁금한 점이 있어서 질문 드립니다. 도움 주시면 감사하겠습니다.

 

첫번째 사진에 style_kind 에 동영상에 대한 kind 정보가 있습니다...

25번 , 21번 , 1 번이라는 유저가  각각 스타일이라는 동영상을 올렸습니다..

 

두번째 사진은 첫번째 사진의 유저가 올린 동영상에 대한 좋아요 입니다

4번의 유저가 25번유저의 스타일을 좋아요 눌렀고 , 26번 유저가 1번유저의  스타일에 대해서 좋아요를 눌렀습니다..

 

그렇게 했더니  세번째 사진처럼 값이 나오게 되었습니다 

네번째 사진처럼 나왔으면 좋겠는데 애초에 api를 따로 만들어서 2개를 돌려야 할지 아니면 조인으로 걸어서 해결 할 수 있는지 궁금합니다... 퀴리는 아래에 있습니다..

 

     SELECT 
            aa.style_code
            ,aa.user_code
            ,aa.style_kind
            ,aa.style_video
            ,aa.admin_accept
            ,aa.admin_reject
            ,aa.modFl
            ,aa.regDt
            ,cc.user_photo
            ,coalesce(bb.like_state, 'initial') AS like_state
        FROM 
            style AS aa
        LEFT outer JOIN 
            style_like AS bb  
        ON
             bb.style_code = aa.style_code
        JOIN
            user AS cc
        ON
            aa.user_code = cc.user_code     
        WHERE
            aa.style_kind = #{style_kind}
        AND
            aa.admin_accept = 1    
        AND
            cc.user_blockd = 'N'
        AND
            bb.user_code IS NULL
        OR
            bb.user_code = #{user_code}
    
        ORDER by
            RAND()
        LIMIT 20    

 동영상을 랜덤으로 20개를 가저와야 하는데 좋아요에 대한 값이 있야서  내가 좋아요 한것은 like 그게 아니면 initial 로 값이 나와야 합니다... 조인에 문제가 있는걸까요? 도움 주시면 감사하겠습니다.

by 마농 [2022.03.21 16:57:41]

b.user_code 에 대한 조건 위치 오류입니다.
- WHERE 절 이 아닌 ON 절에 와야 합니다.
 

-- 1. 전체 조인 후 정렬하여 20건 추출하는 것 보다는. --
SELECT a.style_code
     , a.user_code
     , a.style_kind
     , a.style_video
     , a.admin_accept
     , a.admin_reject
     , a.modFl
     , a.regDt
     , c.user_photo
     , COALESCE(b.like_state, 'initial') like_state
  FROM style a
  LEFT OUTER JOIN style_like b
    ON b.style_code   = a.style_code
   AND b.user_code    = #{user_code}
 INNER JOIN user c
    ON a.user_code    = c.user_code
 WHERE a.style_kind   = #{style_kind}
   AND a.admin_accept = 1    
   AND c.user_blockd  = 'N'
 ORDER BY RAND()
 LIMIT 20
;
-- 2. 정렬하여 20건 추출후 20건만 조인하는 것이 좋습니다.. --
SELECT a.style_code
     , a.user_code
     , a.style_kind
     , a.style_video
     , a.admin_accept
     , a.admin_reject
     , a.modFl
     , a.regDt
     , a.user_photo
     , COALESCE(b.like_state, 'initial') like_state
  FROM (SELECT a.style_code
             , a.user_code
             , a.style_kind
             , a.style_video
             , a.admin_accept
             , a.admin_reject
             , a.modFl
             , a.regDt
             , c.user_photo
          FROM style a
         INNER JOIN user c
            ON a.user_code    = c.user_code
         WHERE a.style_kind   = #{style_kind}
           AND a.admin_accept = 1
           AND c.user_blockd  = 'N'
         ORDER BY RAND()
         LIMIT 20
        ) a
  LEFT OUTER JOIN style_like b
    ON b.style_code = a.style_code
   AND b.user_code  = #{user_code}
;

 


by 마농 [2022.03.21 17:04:28]

style 에서 관리되는 user_code 항목이
style_like 에서 another_user_code 로 중복 관리되고 있네요. (정규화 위배)


by 김성진 [2022.03.21 17:30:45]

마농님 매번 감사합니다.. 덕분에 잘 배우고 있습니다! 다시한번 감사드립니다!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입