Database/MySQL

SQL query ( 이전 글 다음 글 쿼리문 )

Carlos._. 2023. 8. 17.
반응형

문제발생

 

홈페이지 리뉴얼 개발을 진행하던 도중, 

 

이전에 개발했던 이전 글 다음 글 쿼리에서 약간의 오류가 발생했다.

 

이전 글 다음 글을 PK를 기준값으로 정렬하여 이전 글 다음 글 데이터를 가져오도록 설계하였으나,

 

기존 DB를 붓는 과정에서 마구잡이로 담기는 데이터로 인해 PK 시퀀스 값만으로 정렬했을 때 

 

제대로 정렬이 되고있지 않음을 확인할 수 있었다.

 

그로 인해 이전 글, 다음 글을 제대로 가져오지 못하는 결과가 나타나게 되었다.

 

 

IDEA

 

1. 리스트 정렬 조건 수정하기.

 

이러한 문제 해결을 위해서 게시글 리스트를 가져오는 부분에서의 정렬조건도 수정을 필요로 했다.

 

기존 ORDER BY정렬을 PK 값인 시퀀스 값만 했다면, 

 

추가로 게시글 등록일시(우선순위), 시퀀스(다음우선순위) 조건으로 정렬기준을 추가하여 정렬문제를 해결하였다.

 

2. 이전 글 다음 글 SQL 쿼리 수정하기.

 

이전에는 이전 글 다음 글을 해당 게시글의 시퀀스를 기준으로 더 큰 것들 중 LIMIT 1, 값이 작은 것들 중 LIMIT 1 하여 

 

이전, 이후 게시글의 정보값을 가져왔었다.

 

지금 전달되고 있는 파라미터(시퀀스 값)를 유지한 채로 올바른 값을 가져올 수 있는 쿼리를 생각해낸다면 좀 더 간편하게 문제를 해결할 수 있을 것 같았다.

 

 

해결방법

 

LAG OVER, LEAD OVER

두 가지 함수를 사용하여 간단하게 문제를 해결하였다.

 

LAG OVER

LAG(컬럼명,불러올다음숫자,DEFAULT값) OVER(ORDER BY 컬럼명)

위와 같이 사용하여 데이터 정렬 후, 이전 데이터의 특정 컬럼 정보를 가져올 수 있었다.

 

- 내가 사용한 코드

LAG(post_seq) OVER(ORDER BY FIELD(notice_flag, 'N', 'Y'), rgst_dt, post_seq) AS post_seq_prv,
LAG(title) OVER(ORDER BY FIELD(notice_flag, 'N', 'Y'), rgst_dt, post_seq) AS post_title_prv

해당 코드를 통해 이전 게시글의 시퀀스 값과, 제목을 가져와 이전글 바로가기 기능을 구현에 성공하였다.

 

데이터 출력 예시 )

post_seq notice_flag rgst_dt title post_seq_prv post_title_prv
2 Y 2023-08-01 test2    
3 Y 2023-08-01 test3 2 test2
1 N 2023-07-15 test1 3 test3

 

 

LEAD OVER

LEAD(컬럼명,불러올다음숫자,DEFAULT값) OVER(ORDER BY 컬럼명)

위와 같이 사용하여 데이터 정렬 후, 이후 데이터의 특정 컬럼 정보를 가져올 수 있었다.

 

- 내가 사용한 코드

LEAD(post_seq) OVER(ORDER BY FIELD(notice_flag, 'N', 'Y'), rgst_dt, post_seq) AS post_seq_nxt,
LEAD(title) OVER(ORDER BY FIELD(notice_flag, 'N', 'Y'), rgst_dt, post_seq) AS post_title_nxt

해당 코드를 통해 이전 게시글의 시퀀스 값과, 제목을 가져와 이전글 바로가기 기능을 구현에 성공하였다.

 

데이터 출력 예시 )

post_seq notice_flag rgst_dt title post_seq_nxt post_title_nxt
2 Y 2023-08-01 test2 3 test3
3 Y 2023-08-01 test3 1 test1
1 N 2023-07-15 test1    

 

 

결과물

 

 

잘 구현되었다! 

728x90
반응형

댓글