-
내일배움캠프 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