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