ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 내일배움캠프 46일차 (Mysql에서 두 날짜 칼럼을 이용해 정렬하기)
    코딩공부 2023. 7. 20. 14:36

    오늘도 이어서 팀 프로젝트 참여를 하고 있다. 

     

    데이터를 정렬할 때 post의 created_at과 likes_post의 created_at을 동시에 사용하고 싶은데 감이 안와서 고민하고 있다가, 서브쿼리를 사용하는 것이 해답이 되어주지 않을까 하는 생각이 들었다. 

     

    참고글: https://goodteacher.tistory.com/615

     

    서브쿼리 작성을 시작했지만 서로 다른 칼럼에 있는 두 날짜를 비교할 방법을 찾지 못했다.

    그러던 중 if문을 사용할 수 있으면 쉬울 텐데... 라고 생각하며 구글링을 하다  if문을 sql에서도 사용할 수 있다는 것을 알게 되었다. 

    다음은 if문을 사용해 두 칼럼을 함께 사용해 날짜를 정렬한 것이다. 

    likes_post 날짜가 더 클 경우 likes_post의 created_at을 사용하고 아닐 경우 post의 created_at을 사용해 최근 날짜 순으로 정렬한다. 

    select * from post p
        left join likes_post lp on p.id = lp.post_id
        order by (if(p.created_at < lp.created_at, lp.created_at, p.created_at)) desc ;

     

    여기서 중복되는 부분을 제외하고 원래 sql문에 포함시켰다. 

    select p.id, p.created_at, p.modified_at, p.content, p.image_url, p.views, u.user_id
                from post p
                left join likes_post lp on p.id = lp.post_id
                left join users u on p.user_id = u.user_id
                left join follows f on u.user_id = f.following_user_id
                left join follows f2 on lp.user_id = f2.following_user_id
                where (p.user_id = ?1)
                or (lp.user_id = ?1)
                or(f.follower_user_id = ?1)
                or((f2.follower_user_id = ?1)
                and (lp.user_id = f2.following_user_id))
                order by (if(p.created_at < lp.created_at, lp.created_at, p.created_at)) desc;

    엄청나게 길어져 버렸다...

     

    진전은 있었지만 아직 문제가 남아있다.

    1. 마음이 여러번 찍힌 게시물은 중복해서 나옴

    2. (2-1)내 게시글과 (2-2)팔로우한 사람의 게시글이면 팔로우하지 않은 사람이 마음찍은 것도 반영되어 나옴 

     

    2번 문제가 더 중요하다고 생각하여 많은 삽질 끝에 다음 서브쿼리를 작성했다.

    select max(lp.created_at)
        from post p left join likes_post lp
        on p.id = lp.post_id
        where (p.user_id = ?1)

    where절에 위의 서브쿼리를 삽입하였으나 원하는 결과가 나오지 않아 좌절하였으나 서브쿼리 사용법이 잘못되어 그렇다는 것을 알았다. where절 서브쿼리 작성은 다음과 같이 해야했다.

    select * from 테이블명
    where 컬럼명 in (select * from 테이블명 where 조건)

    위의 방식으로 작성하니 원하는 결과가 나왔다! 이를 응용하여 2-2문제 해결을 위한 서브쿼리도 작성했다. 

     

    sql 1차 완성

    select p.id, p.created_at, p.modified_at, p.content, p.image_url, p.views, u.user_id, lp.user_id, lp.created_at
                from post p
                left join likes_post lp on p.id = lp.post_id
                left join users u on p.user_id = u.user_id
                left join follows f on u.user_id = f.following_user_id
                left join follows f2 on lp.user_id = f2.following_user_id
                where (lp.created_at in (select min(lp.created_at)
                                        from post p left join likes_post lp
                                        on p.id = lp.post_id
                                        where (p.user_id = ?1)))
                or ((p.user_id = ?1) and (lp.created_at is null))
                or (lp.user_id = ?1)
                or (lp.created_at in (select min(lp.created_at)
                                      from  post p
                                        left join follows f on p.user_id = f.following_user_id
                                        left join likes_post lp on p.id = lp.post_id
                                      where (f.follower_user_id = ?1)))
                or((f.follower_user_id = ?1)and (lp.created_at is null))
                or((f2.follower_user_id = ?1) and (lp.user_id = f2.following_user_id))
                order by (if(p.created_at < lp.created_at, lp.created_at, p.created_at)) desc;

     

    '코딩공부' 카테고리의 다른 글

    내일배움캠프 59일차  (0) 2023.08.07
    내일배움캠프 47일차  (0) 2023.07.20
    내일배움캠프 44일차  (0) 2023.07.17
    내일배움캠프 41일차  (0) 2023.07.12
    내일배움캠프 40일차  (0) 2023.07.11
Designed by Tistory.