본문 바로가기

DB

MariaDB) 글 번호 정렬 row number() 사용

게시판과 같이 글 번호가 삽입된 채 리스트가 출력되는경우, 글 번호를 정렬해주어야하는 상황이 생긴다.

 

1, 2, 3, 4, 5, 6, 7, 8, 9, 10

 

이렇게 10개의 게시글을 생성한 후

3번 게시물을 삭제했을 때

 

1, 2, 4, 5, 6, 7 ,8 ,9, 10

 

이렇게 3번만 빠진 채로 글 번호가 매겨져있기 때문이다.

 

이것을

1, 2, 3, 4, 5, 6, 7, 8, 9

 

 

이렇게 번호를 다시 매기고 싶을 때?

row number() 함수를 사용할 수 있다.

다만, 버전에 따른 제약이 있어서 mariaDB 10.2 버전 이상부터 사용가능하다.

 

-----------------------------------------------------------------------------------------

 

[ tbl_board 테이블 ]

 

bno 부분을 주목하자.

 

 

위 사진에서 보이듯 bno 가 primary key이다.

그리고 이것을 토대로 게시판 글번호를 매겨주었다.

2부터 시작되어 7,8,9,,는 날아가버리고 20부터 번호가 매겨져있다. 보기에 영 좋지않다.

 

 

 

마리아디비 공식 홈페이지에서는 

 

--------------------------------------------------------------

ROW_NUMBER() OVER ( 
     [ PARTITION BY partition_expression ] 
     [ ORDER BY order_list ]
 )

--------------------------------------------------------------

 

와 같은 문법을 사용하라고 소개 되어있다. 저렇게만 보면 조금 헷갈린다..

 

 

 

 

이것을 위 사진에서 언급된 tbl_board 테이블에 적용시켜보자.

 

우선, bno에 새로운 번호를 매길 예정이기 때문에

bno에 row_number 함수를 적용시켜주고자 한다.

 

--------------------------------------------------------------

SELECT ROW_NUMBER() OVER () AS bno,
title, content, writer, regDate
FROM tbl_board;

--------------------------------------------------------------

 

 

 

이렇게 하면

 

 

bno 부분에 번호가 이빨 빠진 것 없이 깔끔하게 매겨진 것을 확인할 수 있다!

하지만 이대로 페이지에 적용시키면, 디비에서 조회된 것과 달리 정렬이 조금 이상하게 되어있는 것을 볼 수 있다.

(원인은 파악하지 못했다.)

 

 

 

 

--------------------------------------------------------------

SELECT ROW_NUMBER() OVER (ORDER BY regDate) AS bno,
title, content, writer, regDate
FROM tbl_board
ORDER BY bno DESC;

--------------------------------------------------------------

 

위처럼 쿼리를 수정해주자.(order by 추가)

1차적으로 웹 페이지에서 regDate(등록일)를 기준으로 정렬이 되고,

2차적으로 bno(primary key)를 기준으로 내림차순 정렬이 된다.

 

 

 

그래서 최종적으로

 

웹페이지에서 리스트 조회 시 가장 최근에 작성된 게시물이 제일 큰 번호로, 첫번 째 페이지에서 조회된다!

 

 

추가로,

SELECT ROW_NUMBER() OVER (ORDER BY regDate) AS bno,

여기에서 ORDER BY regDate desc 로 해주면 된다는 말을 듣고 수정해보았는데

나는 안 되어서 저렇게 order by를 2번 사용해주었다.ㅡㅡ 

'DB' 카테고리의 다른 글

[DB] 데이터베이스 용어  (0) 2023.02.06
MSSQL) Merge문 사용  (0) 2022.10.05
MSSQL) NULL 값 함께 카운트 하기  (1) 2022.08.10
MySQL) 기본 쿼리문 정리글  (0) 2021.04.08